Kubenates 集群部署方式 kubeadm部署
官网安装地址:https://kubernetes.io/zh-cn/docs/reference/setup-tools/kubeadm/
kubeadm 是一个工具,可以通过kubeadm init 和kubeadm join快速部署k8s集群
kubeadm 的前置操作非常多,会安装各种各样的插件,网络插件,但是安装过程简单
minikube 部署 RKE部署k8s 公有云部署
阿里云ACK
华为云CCE(Cloud Container Engine)
腾讯云EKS(Elastic Kubernetes Service)
国内三方部署工具
Kubeadm部署单Master节点的K8s集群(K8s 1.21 部署)
经过不断的摸索尝试,除了最后的k8s的初始化节点(kubelet init之后的操作) ,其他的前置准备工作,每个节点都要做
清单中2.5之前的工作,每一个工作节点都要执行
部署环境准备工作
操作系统统一使用CentOS7.9 整个过程在vmware虚拟机中进行 每个节点至少2核心4G的配置 网络模式:Net模式 网关:192.168.77.2
CPU
内存
硬盘
角色
主机名称
ip地址
2Core
4G
50G
master
k8s-master01
192.168.77.210
2Core
4G
50G
worker
k8s-worker01
192.168.77.211
2Core
4G
50G
worker
k8s-worker02
192.168.77.212
主机配置 主机名配置 分别设置三台主机的主机名称
k8s-master01
1 hostnamectl set-hostname k8s-master01 # 192.168.77.210
k8s-worker01
1 hostnamectl set-hostname k8s-worker01 # 192.168.77.211
8s-worker02
1 hostnamectl set-hostname k8s-worker02 # 192.168.77.212
主机ip地址配置 /etc/sysconfig/network-scripts/ifcfg-ens33 1 vim /etc/sysconfig/network-scripts/ifcfg-ens33
k8s-master01的ip地址配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="static" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="ens33" UUID="f693d834-f55e-4c2e-8329-957cc221303d" DEVICE="ens33" ONBOOT="yes" IPADDR="192.168.77.210" GATEWAY="192.168.77.2" DNS1="119.29.29.29"
k8s-worker01的ip地址配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="static" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="ens33" UUID="f693d834-f55e-4c2e-8329-957cc221303d" DEVICE="ens33" ONBOOT="yes" IPADDR="192.168.77.211" GATEWAY="192.168.77.2" DNS1="119.29.29.29"
k8s-worker02的ip地址配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [root@k8s-worker02 ~]# TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="static" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="ens33" UUID="f693d834-f55e-4c2e-8329-957cc221303d" DEVICE="ens33" ONBOOT="yes" IPADDR="192.168.77.212" GATEWAY="192.168.77.2" DNS1="119.29.29.29"
主机名和IP地址解析
所有的集群主机都需要配置 vim /etc/hosts 追加如下配置
1 2 3 192.168.77.210 k8s-master01 192.168.77.211 k8s-worker01 192.168.77.212 k8s-worker02
关闭防火墙配置 1 2 3 # systemctl disable firewalld 关闭开机子启动 # systemctl stop firewalld 关机防火墙 # firewall-cmd --state
禁用SELINUX配置 所有的主机都要操作,操作完成后要重启
服务器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 vim /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enforcing # SELINUXTYPE= can take one of three values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted
更改上述配置文件中的
1 2 SELINUX=enforcing 为disabled 然后保存退出
时间同步配置(所有节点) 同步时间服务器需要安装ntpdate
1 2 3 # which ntpdate 查看 crontab -e 0 */1 * * * ntpdate time1.aliyun.com #每隔一小时同步一下阿里云服务器
升级操作系统内核(所有节点都要执行) 1 2 导入 elrepo gpg key (确认软件合法性) # rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
1 2 3 安装elrepo yum 源仓库 # yum -y install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm # 验证是否包含elrepo的包 yum repolist 观察是否存在elrepo
1 2 安装kernel-ml 内核版本,ml为长期稳定版本,lt 为长期维护版本 # yum --enablerepo="elrepo-kernel" -y install kernel-ml.x86_64
1 2 3 4 5 设置安装的内核优先启动 ,设置默认的引导项为0 # grub2-set-default 0 该命令不会立即生效,所以需要重新生成配置文件 # grub2-mkconfig -o /boot/grub2/grub.cfg
1 2 3 4 # 更新后需要重启,使用升级的内核生效 reboot uname -r 重启后查看内核是否更新为对应的版本 uname -r
配置内核转发及网桥过滤
所有的主机均需要操作
添加网桥过滤及内核转发配置文件
1 2 3 4 5 6 vim /etc/sysctl.d/k8s.conf 复制如下到该文件中 net.bridge.bridge-nf-call-ip6tables=1 net.bridge.bridge-nf-call-iptables=1 net.ipv4.ip_forward=1 vm.swappiness=0
保存退出
1 2 3 4 5 6 7 8 9 # 加载br_netfilter模块 modprobe br_netfilter 查看是否加载 lsmod | grep br_netfilter # 加载网桥过滤及内核转发配置文件 sysctl -p /etc/sysctl.d/k8s.conf
安装ipset及ipvadm
安装ipset 及ipvsadm
1 2 3 4 5 6 7 8 9 10 yum -y install ipset ipvsadm # 配置ipvsadm 模块加载方式 cat > /etc/sysconfig/modules/ipvs.modules << EOF #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack EOF
授权、运行检查是否加载
1 chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack
关闭swap分区(所有节点都要执行) 因为关闭后,可以提高k8s的性能。且初始化master节点的时候不会报错
1 2 3 4 5 6 7 8 9 10 11 12 vi /etc/fstab # # /etc/fstab # Created by anaconda on Mon Oct 3 15:41:00 2022 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/centos-root / xfs defaults 0 0 UUID=715915d4-5b52-469f-a69d-f92410a28415 /boot xfs defaults 0 0 #/dev/mapper/centos-swap swap swap defaults 0 0 swap前加个#号
装Docker(所有的节点都要执行) 下面是阿里云官网提供的安装的方式
查看可以安装的docker的版本
1 yum list docker-ce.x86_64 --showduplicates |sort -r
配置docker安装 1 2 3 4 5 6 7 8 9 10 # step 1: 安装必要的一些系统工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # Step 2: 添加软件源信息 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # Step 3: 更新并安装 Docker-CE sudo yum makecache fast sudo yum -y install docker-ce # Step 4: 开启Docker服务 sudo service docker start
配置镜像加速器 1 2 3 4 5 6 7 8 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://rv0ikufp.mirror.aliyuncs.com"] # 配置自己的阿里云镜像操作地址 } EOF sudo systemctl daemon-reload sudo systemctl restart docker
配置开启自启动 1 systemctl enable docker;systemctl start docker
修改cgroup 方式 1 2 3 4 vim /etc/docker/daemon.json 中添加如下内容 { "exec-opts":["native.cgroupdriver=systemd"] }
重启docker 1 systemctl restart docker
kubelet集群部署
kubeadm
kubelet
kubectl
版本
1.21.0
1.21.0
1.21.0
安装位置
集群中所有的主机
集群中所有的主机
集群中所有的主机
作用
初始化集群、管理集群等
用于接口api-server并对pod的生命周期进行管理
集群应用的命令行管理工具
kubernates yum 源准备 阿里云的yum源 (所有的节点都要执行) vim /etc/yum.repos.d/kubernetes.repo
1 2 3 4 5 6 7 8 9 10 11 12 cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
1 yum repolist 查看yum源是否可用,网络不好的情况下,注意观察,否则后续操作可能会失败
集群软件安装(都要执行) 1 2 3 4 5 6 7 8 # 查看指定的版本 yum list kubeadm.x86_64 --showduplicates | sort -r yum list kublet.x86_64 --showduplicates | sort -r yum list kubectl.x86_64 --showduplicates | sort -r # 安装指定的版本 yum -y install --setopt=obsoletes=0 kubeadm-1.21.0-0 kubelet-1.21.0-0 kubectl-1.21.0-0
配置kubelet(都要执行) 1 2 3 4 5 vim /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS="--cgroup-driver=systemd" # 设置kubelet开机自启动 systemctl enable kubelet
集群镜像准备(所有节点都要) 1 #强制删除所有镜像的命令(慎用) docker rmi --force $(docker images -q)
1 2 3 # 查看 需要下载镜像 kubeadm config images list --kubernetes-version=v1.21.0
编写镜像下载脚本 vim images_pull.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #!/bin/bash images_list=' k8s.gcr.io/kube-apiserver:v1.21.0 k8s.gcr.io/kube-controller-manager:v1.21.0 k8s.gcr.io/kube-scheduler:v1.21.0 k8s.gcr.io/kube-proxy:v1.21.0 k8s.gcr.io/pause:3.4.1 k8s.gcr.io/etcd:3.4.13-0 k8s.gcr.io/coredns/coredns:v1.8.0' for i in $images_list do docker pull $i done docker save -o k8s-1-21-0.tar $images_list
可能会遇到镜像拉不下来的场景,可以换成如下脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 #!/bin/bash # 下面的镜像应该去除"k8s.gcr.io"的前缀,版本换成kubeadm config images list命令获取 到的版本 images=( kube-apiserver:v1.21.0 kube-controller-manager:v1.21.0 kube-scheduler:v1.21.0 kube-proxy:v1.21.0 pause:3.4.1 etcd:3.4.13-0 coredns:v1.8.0 ) for imageName in ${images[@]} ; do docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName done docker tag k8s.gcr.io/coredns:v1.8.0 k8s.gcr.io/coredns/coredns:v1.8.0 docker rmi k8s.gcr.io/coredns:v1.8.0 docker save -o k8s.1.21.0.tar \ k8s.gcr.io/kube-proxy:v1.21.0 \ k8s.gcr.io/kube-apiserver:v1.21.0 \ k8s.gcr.io/kube-controller-manager:v1.21.0 \ k8s.gcr.io/kube-scheduler:v1.21.0 \ k8s.gcr.io/coredns/coredns:v1.8.0 \ k8s.gcr.io/etcd:3.4.13-0 \ k8s.gcr.io/pause:3.4.1 \
保存镜像
1 2 3 4 5 6 7 8 docker save -o k8s.1.21.0.tar \ k8s.gcr.io/kube-proxy:v1.21.0 \ k8s.gcr.io/kube-apiserver:v1.21.0 \ k8s.gcr.io/kube-controller-manager:v1.21.0 \ k8s.gcr.io/kube-scheduler:v1.21.0 \ k8s.gcr.io/coredns:v1.8.0 \ k8s.gcr.io/etcd:3.4.13-0 \ k8s.gcr.io/pause:3.4.1 \
master节点初始化工作 初始化 1 2 3 4 5 kubeadm init --kubernetes-version v1.21.0 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.77.210 # 只有master节点进行初始化 # --kubernetes=v1.21.0 k8s的版本 # --pod-network-cidr=10.244.0.0/16 k8s集群内的网络 不要使用真实网络的网段 # --apiserver-advertise-address=192.168.77.210 api-server监听的地址
会得到以下提示,按照步骤输入即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [addons] Applied essential addon: kube-proxy Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: # 部署配置 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf #部署网络 You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: # 工作节点加入master中 kubeadm join 192.168.77.210:6443 --token el7wfg.8xwwykz5hcn8y0ew \ --discovery-token-ca-cert-hash sha256:a6295f2bb6fff92c8b20e6506baa8f7f8a88abade29a3e29c9ff5382c3956f3b 您在 /var/spool/mail/root 中有新邮件
第一步执行配置命令:
1 2 3 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubernate 集群网络配置
https://projectcalico.docs.tigera.io/getting-started/kubernetes/quickstart
左侧Install Calico] -> Kubernetes->Quickstart
运行
1 2 # 如果这一步执行不了,把域名换成指定的ip地址配置在hosts里面 域名ip查询链接链接:http://ip.tool.chinaz.com/ 或者把文件下载到本地计算机再上传到服务器里面,不需要改什么东西 kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/tigera-operator.yaml
第二步骤,下载该文件,如果文件下载不下来,可以使用如下已经下载好的文件
wget https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/custom-resources.yaml
custom-resources.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 apiVersion: operator.tigera.io/v1 kind: Installation metadata: name: default spec: calicoNetwork: ipPools: - blockSize: 26 cidr: 10.244 .0 .0 /16 encapsulation: VXLANCrossSubnet natOutgoing: Enabled nodeSelector: all() --- apiVersion: operator.tigera.io/v1 kind: APIServer metadata: name: default spec: {}
修改13行为k8s初始化时自己设置的网段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 kubectl apply -f custom-resources.yaml kubectl get ns #查看命名空间calio-system # 查看节点是否加入了calico网络中去 watch kubectl get pods -n calico-system # 出现如下提示,网络就已经可以了 Every 2.0s: kubectl get pods -n calico-system Mon Oct 10 18:33:12 2022 NAME READY STATUS RESTARTS AGE calico-kube-controllers-78687bb75f-4j7f5 1/1 Running 0 5m48s calico-node-575vz 1/1 Running 0 5m49s calico-typha-5978d86859-gfnwb 1/1 Running 0 5m49s csi-node-driver-drqb2 2/2 Running 0 3m29s # 如果某些节点一直处于初始化节点,需要把污点取消 kubectl taint nodes --all node-role.kubernetes.io/control-plane-node-role.kubernetes.io/master-
1 2 3 4 5 6 7 8 9 官网下载地址: https://docs.projectcalico.org/v3.24.1/manifests/calico.yaml github地址: https://github.com/projectcalico/calico docker pull calico/cni:v3.24.1 docker pull calico/pod2daemon-flexvol:v3.24.1 docker pull calico/node:v3.24.1 docker pull calico/kube-controllers:v3.24.1
安装calio客户端
https://projectcalico.docs.tigera.io/maintenance/clis/calicoctl/install
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 curl -L https://github.com/projectcalico/calico/releases/download/v3.24.1/calicoctl-linux-amd64 -o calicoctl mv calicoctl /usr/bin # 添加可执行权限 chmod +x /usr/bin/calicoctl ls -l /usr/bin/calicoctl # 查看版本 calicoctl version 效果如下:通过宿主机下面的隐藏文件,获取节点 [root@k8s-master01 calicodir]# DATASTORE_TYPE=kubernetes KUBECONFIG=~/.kube/config calicoctl get nodes NAME k8s-master01 [root@k8s-master01 calicodir]#
在k8s集群工作节点中添加 k8s-worker01节点
1 2 3 [root@k8s-worker02 ~]# kubeadm join 192.168.77.210:6443 --token el7wfg.8xwwykz5hcn8y0ew \ > --discovery-token-ca-cert-hash sha256:a6295f2bb6fff92c8b20e6506baa8f7f8a88abade29a3e29c9ff5382c3956f3b
k8s-worker02节点
1 2 3 [root@k8s-worker01 ~]# kubeadm join 192.168.77.210:6443 --token el7wfg.8xwwykz5hcn8y0ew \ > --discovery-token-ca-cert-hash sha256:a6295f2bb6fff92c8b20e6506baa8f7f8a88abade29a3e29c9ff5382c3956f3b
在master节点执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [root@k8s-master01 /]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master01 Ready control-plane,master 5h41m v1.21.0 k8s-worker01 NotReady <none> 103s v1.21.0 k8s-worker02 NotReady <none> 98s v1.21.0 网络的初始化完成,需要一些时间,可以通过如下命令查询 [root@k8s-master01 /]# kubectl get pods -n calico-system NAME READY STATUS RESTARTS AGE calico-kube-controllers-78687bb75f-4j7f5 1/1 Running 0 15m calico-node-575vz 1/1 Running 0 15m calico-node-d686n 0/1 Init:0/2 0 2m36s calico-node-t2585 0/1 Init:0/2 0 2m41s calico-typha-5978d86859-gfnwb 1/1 Running 0 15m calico-typha-5978d86859-qk2mt 0/1 ContainerCreating 0 2m30s csi-node-driver-drqb2 2/2 Running 0 13m
1 2 3 4 5 kubeadm init 初始化日志中会有kubeadm join 复制在worker节点中执行 # 查看节点是否加入了calico网络中去 DATASTORE_TYPE=kubernetes KUBECONFIG=~/.kube/config calicoctl get nodes
完全卸载K8s 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 kubeadm reset -f modprobe -r ipip rm -rf ~/.kube/ rm -rf /etc/kubernetes/ rm -rf /etc/systemd/system/kubelet.service.d rm -rf /etc/systemd/system/kubelet.service rm -rf /usr/bin/kube* rm -rf /etc/cni rm -rf /opt/cni rm -rf /var/lib/etcd rm -rf /var/etcd yum clean all yum remove kube* 1、杀死运行的容器: # docker kill $(docker ps -a -q) 2、删除所有容器: # docker rm $(docker ps -a -q) 3、强制删除所有镜像: # docker rmi -f $(docker images -q)
报错问题记录 K8S安装node加入到节点错误Running pre-flight checks 1 2 3 1.时间不同步 2.token过期 3.master主节点防火墙没有关闭
kubectl join 生成 1 kubeadm token create --ttl 0 --print-join-command