翼度科技»论坛 云主机 服务器技术 查看内容

kubernetes使用kubeadm创建集群实操教程(全)

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
根据官方文档,总共有三种使用部署工具安装kubernetes的方式,分别是使用kubeadm 引导集群、使用kOps安装 Kubernetes、使用Kubespray安装 Kubernetes。

在本次部署设计中,采用kubeadm引导集群的方式,主要运用了安装kubeadm、对kubeadm进行故障排查、使用kubeadm创建集群。目标是要安装单个控制平面的Kubernetes集群,在集群上安装Pod网络,以便Pod可以相互连通。

一、虚拟机准备

准备三台预先安装docker、cri-docker环境、kubernetes组件、cri-docker环境的虚拟机。

(一)主机基本配置

创建虚拟机,根据官方文档,本次实验在CentOS 8环境下进行,主机内存设置4GB,处理器个数为4,采用NAT网络适配器。


(二)安装docker

详细安装过程:CentOS 8:在Linux环境下安装和卸载Docker

1. 安装docker
  1. yum install -y
  2. yum-utils device-mapper-persistent-data lvm2
复制代码
2. 设置阿里云源
  1. yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
复制代码
3. 安装 Docker Engine-Community
  1. yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
复制代码
4. 设置docker开机自动启动
  1. systemctl enable docker
复制代码
(三)配置cri-docker环境


1. 提前下载cri-docker环境拖入虚拟机,解压缩并移动到指定位置
  1. tar -xf cri-dockerd-0.3.4.amd64.tgz -C /usr/local/
  2. ls /usr/local
  3. mv /usr/local/cri-dockerd/cri-dockerd /usr/local/bin/
复制代码


2. 配置cri-dockerd.service文件
  1. vim /etc/systemd/system/cri-dockerd.service
复制代码
  1. # cri-dockerd.service文件内容

  2. [Unit]
  3. Description=CRI Interface for Docker Application Container Engine
  4. Documentation=https://docs.mirantis.com
  5. After=network-online.target firewalld.service docker.service
  6. Wants=network-online.target

  7. [Service]
  8. Type=notify
  9. ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9 --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --cri-dockerd-root-directory=/var/lib/dockershim --docker-endpoint=unix:///var/run/docker.sock --cri-dockerd-root-directory=/var/lib/docker
  10. ExecReload=/bin/kill -s HUP $MAINPID
  11. TimeoutSec=0
  12. RestartSec=2
  13. Restart=always
  14. StartLimitBurst=3
  15. StartLimitInterval=60s
  16. LimitNOFILE=infinity
  17. LimitNPROC=infinity
  18. LimitCORE=infinity
  19. TasksMax=infinity
  20. Delegate=yes
  21. KillMode=process

  22. [Install]
  23. WantedBy=multi-user.target
复制代码
3. 配置cri-dockerd.socket文件
  1. vim /etc/systemd/system/cri-dockerd.socket
复制代码
  1. # cri-dockerd.socket文件内容

  2. [Unit]
  3. Description=CRI Docker Socket for the API
  4. PartOf=cri-docker.service

  5. [Socket]
  6. ListenStream=/var/run/cri-dockerd.sock
  7. SocketMode=0660
  8. SocketUser=root
  9. SocketGroup=docker

  10. [Install]
  11. WantedBy=sockets.target
复制代码
4. 启动cri-docker服务
  1. systemctl daemon-reload
  2. systemctl start cri-dockerd.service
  3. systemctl enable cri-dockerd.service
复制代码


(四)安装kubeadm、kubelet、kubectl

kubeadm:用来初始化集群的指令。
kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
kubectl:用来与集群通信的命令行工具。

1. 配置kubernetes的yum源
  1. vim /etc/yum.repos.d/kubernetes.repo
复制代码
  1. # kubernetes.repo文件内容

  2. [kubernetes]
  3. name = Kubernetes
  4. baseurl = https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
  5. enabled = 1
  6. gpgcheck = 0
  7. repo_gpgcheck = 0
  8. gpgkey = https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
复制代码
2. 安装Kubernetes三大组件
  1. dnf install kubelet kubeadm kubectl
复制代码


3. 设置kubectl开机自动启动
  1. systemctl enable kubectl
复制代码
(五)克隆主机


1. 进入克隆虚拟机向导,选择创建完整克隆



2. 根据需要为克隆主机重命名,修改存储位置




二、环境配置工作

在三台主机中均要进行如下的环境配置工作

(一)修改主机名

对三台主机分别修改主机名
  1. hostnamectl set-hostname master
复制代码
  1. hostnamectl set-hostname slave1
复制代码
  1. hostnamectl set-hostname slave2
复制代码
(二)编辑hosts文件


1. 查看主机ip地址
  1. ifconfig
复制代码
2. 编辑/etc/hosts文件
  1. vim /etc/hosts
复制代码
  1. # /etc/hosts文件内容

  2. 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
  3. ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
  4. 192.168.211.137 master
  5. 192.168.211.136 slave1
  6. 192.168.211.138 slave2
复制代码


(三)关闭防火墙、selinux、swap


1. 关闭防火墙

避免后续需要配置开放端口
  1. systemctl stop firewalld.service
  2. systemctl disable firewalld.service
复制代码
2. 关闭selinux

selinux会限制容器对宿主机文件系统和系统资源的访问权限
  1. setenforce 0
  2. sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
复制代码
3. 关闭swap分区,编辑/etc/fstab文件

kubelet要求必须禁用交换分区,kubeadm初始化时会检测swap是否关闭
  1. vim /etc/fstab
复制代码
修改/etc/fstab文件内容,注释swap行
  1. # /etc/fstab文件内容(局部)

  2. # /dev/mapper/cl-swap     none                    swap    defaults        0 0
复制代码


(四)配置同步时间、系统模块


1. 设置本地时区,加载RTC设置

确保集群中的各个组件在进行各种操作时具有一致的时间戳
  1. timedatectl set-local-rtc 0
  2. timedatectl set-timezone Asia/Shanghai
  3. hwclock –systohc
复制代码
2. 加载和检查系统模块

确保Kubernetes网络和容器的正常运行
  1. modprobe br_netfilter
  2. lsmod | grep br_netfilter
复制代码


(五)配置SSH免密登录

配置Kubernetes集群需要在不同的节点之间进行通信和操作,配置SSH免密登录能够简化操作,避免每次执行操作都需要手动输入密码。

1. 生成新的密钥对
  1. ssh-keygen
复制代码


2. 将公钥复制到目标主机
  1. ssh-copy-id root@master
  2. ssh-copy-id root@slave1
  3. ssh-copy-id root@slave2
复制代码




3. 检验配置结果
  1. ssh root@master
  2. ssh root@slave1
  3. ssh root@slave2
复制代码


三、准备容器所需的镜像

由于无法访问外网,不能下载存放在registry.k8s.io上的默认容器镜像,这里选择在阿里云上进行拉取镜像,然后使用tag命令修改为它需求的镜像标签,以下操作在三台主机中都要进行。

(一)查看所需镜像文件

查看Kubernetes集群需要的镜像
  1. kubeadm config images list
复制代码


(二)配置daemon.json文件


1. 在阿里云中启用镜像加速器



2. 配置/etc/docker/daemon.json文件


在阿里云操作文档的基础上添加驱动命令修改docker的驱动为systemd,使其与与k8s保持一致,避免冲突
  1. tee
  2. /etc/docker/daemon.json <<-'EOF'
  3. {
  4.   "registry-mirrors":["https://2nd8r72o.mirror.aliyuncs.com"],
  5.   "exec-opts":[ "native.cgroupdriver=systemd" ]
  6. }
  7. EOF
复制代码
3. 载入daemon.json文件并重启docker
  1. systemctl daemon-reload
  2. systemctl restart docker
复制代码


(三)拉取镜像文件

拉取阿里云里所需要的镜像
  1. docker pull  registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.4
  2. docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.4
  3. docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.4
  4. docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.28.4
  5. docker pull registry.aliyuncs.com/google_containers/pause:3.9
  6. docker pull registry.aliyuncs.com/google_containers/etcd:3.5.9-0
  7. docker pull registry.aliyuncs.com/google_containers/coredns:v1.10.1
复制代码








(四)修改镜像标签

使用tag修改为需求的镜像标签
  1. docker tag  registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.4   registry.k8s.io/kube-apiserver:v1.28.4
  2. docker tag  registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.4   registry.k8s.io/kube-controller-manager:v1.28.4
  3. docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.4   registry.k8s.io/kube-scheduler:v1.28.4
  4. docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.28.4   registry.k8s.io/kube-proxy:v1.28.4
  5. docker tag registry.aliyuncs.com/google_containers/pause:3.9  registry.k8s.io/pause:3.9
  6. docker tag registry.aliyuncs.com/google_containers/etcd:3.5.9-0 registry.k8s.io/etcd:3.5.9-0
  7. docker tag registry.aliyuncs.com/google_containers/coredns:v1.10.1 registry.k8s.io/coredns/coredns:v1.10.1
复制代码


(五)查看镜像结果

查看本地镜像,确认是否有需要的镜像
  1. docker images
复制代码


四、具体节点配置


(一)初始化Kubernetes集群


1. 在主节点执行初始化的命令

apiserver-advertise-address用来指定API服务器的广播地址。
kubernetes-version指定要安装的Kubernetes版本。
service-cidr指定服务网络的CIDR范围。
pod-network-cidr指定Pod网络的CIDR范围。
ignore-preflight-errors=all忽略所有预检错误。
cri-socket指定容器运行时的UNIX套接字路径。
另外,由于前一步骤已经安装了集群所需的镜像,在命令进行时会提示镜像已存在而不再拉取,故也不再需要设置image-repository的值
  1. kubeadm init \
  2. --apiserver-advertise-address=192.168.211.137 \
  3. --kubernetes-version v1.28.4 \
  4. --service-cidr=10.96.0.0/12 \
  5. --pod-network-cidr=10.244.0.0/16 \
  6. --ignore-preflight-errors=all \
  7. --cri-socket=unix:///var/run/cri-dockerd.sock
复制代码
  1. 如果报错则输入下面命令恢复原有状态
  2. [code]systemctl stop kubelet
  3. rm -rf /etc/kubernetes/*
  4. systemctl stop docker
  5. rm -rf /var/lib/kubelet/
  6. rm -rf /var/lib/etcd
复制代码
[/code]
  1. 在这一部分出现的主要问题是:在前期原本只安装了docker而没有安装cri-dockerd,经过查资料发现k8s在1.20.X版本以后就弃用了docker,于是临时改用containerd,重新在containerd拉取镜像和改标签,但在使用中仍有bug无法解决。于是选择安装cri-dockerd再次进行以上命令,执行成功。
复制代码
2. 初始化成功显示以下内容
  1. Your Kubernetes control-plane has initialized successfully!

  2. To start using your cluster, you need to run the following as a regular user:

  3.   mkdir -p $HOME/.kube
  4.   sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  5.   sudo chown $(id -u):$(id -g) $HOME/.kube/config

  6. Alternatively, if you are the root user, you can run:

  7.   export KUBECONFIG=/etc/kubernetes/admin.conf

  8. You should now deploy a pod network to the cluster.
  9. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  10.   https://kubernetes.io/docs/concepts/cluster-administration/addons/

  11. Then you can join any number of worker nodes by running the following on each as root:

  12. kubeadm join 192.168.211.137:6443 --token ejgoxs.086hnhj7qipovd6v \
  13.         --discovery-token-ca-cert-hash sha256:6bbe9e754e2b0ab13301e76268c347b9f95b661b2399630ecfa8da9497ca5744
复制代码
  1. 初始化成功后虚拟机卡顿严重,通过关闭后提高处理器、内存等配置得以缓解
复制代码
3. 根据提示运行kubectl

我使用root用户,可以直接设置KUBECONFIG环境变量,可以让kubectl命令行工具自动找到并使用这个配置文件
  1. export KUBECONFIG=/etc/kubernetes/admin.conf
复制代码
(二)部署Pod网络

部署Pod网络是为了提供容器间和跨节点的网络通信,实现网络策略和安全性,支持服务发现和负载均衡

1. 进入提示的网站,选择flannel网络组件





2. 安装CNI网络插件

根据网站内提示,Flannel默认用作 CNI 网络插件,部署Flannel时需确保CNI网络插件有安装,由于国内访问Github不稳定,这里提前下载好插件,拖入虚拟机的主目录,再进行解压等命令
  1. mkdir -p /opt/cni/bin
  2. tar -C /opt/cni/bin -xzf cni-plugins-linux-amd64-v1.2.0.tgz
复制代码


3. 使用kubectl部署flannel

根据网站内提示,提前下载好yml文件,拖入虚拟机的主目录,再输入命令
  1. kubectl apply -f kube-flannel.yml
复制代码


(三)加入子节点


1. 在主节点中将kubeconfig环境变量分发到子节点

kubeconfig环境变量指定了kubectl命令使用的kubeconfig文件的路径,该文件包含了连接到集群所需的认证和配置信息,让子节点上的kubectl命令能够连接到Kubernetes集群的控制平面
  1. scp /etc/kubernetes/admin.conf slave1:/etc/kubernetes/
  2. scp /etc/kubernetes/admin.conf slave2:/etc/kubernetes/
复制代码
  1. 设计结束后,在官方安装文档上注意到其实建议不要将admin.conf文件与任何人共享,应该使用kubeadm kubeconfig user命令为其他用户生成 kubeconfig文件
复制代码
2. 在两个node节点中输入以下命令

由于同时有containerd和docker,在提示的命令基础上加了cri-socket参数,指定为cri-dockerd
  1. kubeadm join 192.168.211.137:6443 \
  2. --token ejgoxs.086hnhj7qipovd6v \
  3. --discovery-token-ca-cert-hash sha256:6bbe9e754e2b0ab13301e76268c347b9f95b661b2399630ecfa8da9497ca5744 \
  4. --cri-socket=unix:///var/run/cri-dockerd.sock
复制代码
  1. 报错则输入下面命令恢复原有状态,再根据报错提示进行调整
  2. [code]rm -rf /etc/kubernetes/kubelet.conf
  3. rm -rf /etc/kubernetes/pki/ca.crt
  4. systemctl restart kubelet
复制代码
[/code]


(四)确保节点Ready状态


1. 查看节点状态
  1. kubectl get nodes
复制代码


2. 显示NotReady,需要修改yml文件

原因是pod之间无法ping通,需要让flanneld包发到指定网卡,数据包才能正常的经过flannel进行传送
  1. ifconfig
  2. vim kube-flannel.yml
复制代码
在kube-flannel.yml文件第139行加上
  1.         - --iface=ens160
复制代码
再次查看显示正确
  1. kubectl get nodes
复制代码


3. 查看命名空间kube-system的pod的状态
  1. kubectl get pods -n kube-system
复制代码


五、Kubernetes集群测试


(一)创建mynginx pod

创建一个nginx镜像,向Kubernetes集群提交一个Pod创建的请求,控制平面会根据集群的配置和调度策略,在可用的节点上选择一个节点来运行这个Pod。
  1. kubectl create deployment mynginx --image=nginx
复制代码


(二)暴露端口

创建一个Service资源,并将其关联到mynginx Pod,将其与集群的外部网络连接起来,指定Service的端口为80,并使用NodePort类型,NodePort类型会在每个节点上选择一个端口,将外部流量转发到Service的端口上。
  1. kubectl expose deployment mynginx --port=80 --type=NodePort
复制代码


(三)访问nginx

通过浏览器访问任一节点的IP地址和暴露的NodePort端口,可以访问到nginx服务,说明测试成功
  1. 192.168.211.136:30619
  2. 192.168.211.138:30619
复制代码
六、总结

到此这篇关于kubernetes使用kubeadm创建集群实操教程(全) 的文章就介绍到这了,更多相关kubernetes使用kubeadm创建集群内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/server/3234834iz.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具