K8S教程(2)使用kubeadm方式安装K8S 1.18集群
一、K8S的安装方式介绍
· 二进制部署
用户需要把Master中心节点的所有组件通通安装,同理Node节点也需要安装对应的核心组件,还需要手动配置多组CA证书,过程繁琐,但是对理解K8S的详细运作是最好的。
· kubeadmin部署
K8S官方推出的集群管理工具,在K8S 1.13版本后已经可以在生产环境中使用,但需要注意证书的过期问题。它把原本需要自己部署的组件通过镜像方式拉到本地进行使用。用户只需要安装好kubelet和docker,然后每个Master和Node节点上安装kubeadm即可,通过kubeadm init把第一个节点初始化为Master;通过kubeadm join将其他节点初始化为Node并加入集群。
二、K8S集群节点环境准备
1、所有节点升级系统内核到4.18及以上
#导入ELRepo仓库的公共密钥 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org #安装elrepo仓库源 yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm #查看仓库中可用内核 yum --disablerepo="*" --enablerepo="elrepo-kernel" list available #安装所需内核 yum --enablerepo="elrepo-kernel" install kernel-lt #查看当前系统中可用内核,其中第一列的数字就是可用内核编号,如下 awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg 0 : CentOS Linux (4.18.7-1.el7.elrepo.x86_64) 7 (Core) 1 : CentOS Linux (3.10.0-862.11.6.el7.x86_64) 7 (Core) 2 : CentOS Linux (0-rescue-063ec330caa04d4baae54c6902c62e54) 7 (Core) #切换默认内核,0代表使用4.18这个内核 grub2-set-default 0
2、所有节点进行环境配置
# 所有节点做好hosts解析 cat /etcc/hosts 192.168.0.101 k8s-master01 192.168.0.102 k8s-master02 192.168.0.103 k8s-master03 192.168.0.200 k8s-master-lb 192.168.0.111 k8s-node01 192.168.0.112 k8s-node02 # 所有节点配置k8s集群中必须的内核参数 cat <<EOF > /etc/sysctl.d/k8s.conf net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-iptables = 1 fs.may_detach_mounts = 1 vm.overcommit_memory=1 vm.panic_on_oom=0 fs.inotify.max_user_watches=89100 fs.file-max=52706963 fs.nr_open=52706963 net.netfilter.nf_conntrack_max=2310720 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_probes = 3 net.ipv4.tcp_keepalive_intvl =15 net.ipv4.tcp_max_tw_buckets = 36000 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_max_orphans = 327680 net.ipv4.tcp_orphan_retries = 3 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.ip_conntrack_max = 65536 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.tcp_timestamps = 0 net.core.somaxconn = 16384 EOF sysctl --system # 所有节点关闭防火墙、selinux、swap等 systemctl disable firewalld && systemctl stop firewalld systemctl disable NetworkManager && systemctl stop NetworkManager setenforce 0 cat /etc/sysconfig/selinux SELINUX=disabled #KUBEADM为了避免pod运行在swap中影响性能,默认会需要关闭SWAP swapoff -a && sysctl -w vm.swappiness=0 # 所有节点配置好时间同步,ntp或chrony都可以,略 # 在每个节点配置阿里云Docker YUM源和加速器,安装Docker并开机自启,否则系统重启后K8S会因为镜像没启动而失败 yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache fast yum -y install docker-ce #配置docker镜像加速以及驱动模式 cat > /etc/docker/daemon.json << EOF { "registry-mirrors": ["https://6blvkhyf.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdrive-systemd"] } EOF systemctl enable docker && systemctl start docker # 配置阿里云 K8S YUM cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF # 所有节点安装ipvsadm yum install ipvsadm ipset sysstat conntrack libseccomp -y # 在每个节点安装kubelet、kubeadm、kubectl并启动服务 yum install -y kubelet kubeadm kubectl #由于官网未开放同步方式, 可能会有gpg检查失败的情况, 这时请用yum install -y --nogpgcheck kubelet kubeadm kubectl 安装 systemctl enable kubelet && systemctl start kubelet
三、kubeadm部署K8S Master
1、查看K8S所需镜像
K8S需要的组件都实现了容器化,所以可以直接拉取这些镜像来满足集群需求。通过下面的命令可以查看集群所需的组件版本
kubeadm config images list --kubernetes-version v1.22.3
2、拉取K8S所需镜像
但是由于kubeadm初始化时会从国外地址k8s.gcr.io拉取镜像,如果服务器在国内的话是无法正常拉取的。所以这里需要先通过docker hub手动下载镜像再修改tag名,拉取前可以先配置好docker的镜像加速器。具体用到的仓库名可以去dockerhub去搜索,这里用到的是kubesphere
#拉取镜像 docker pull kubesphere/kube-apiserver:v1.18.6 docker pull kubesphere/kube-controller-manager:v1.18.6 docker pull kubesphere/kube-scheduler:v1.18.6 docker pull kubesphere/kube-proxy:v1.18.6 docker pull kubesphere/pause:3.2 docker pull azhu/etcd:3.4.3-0 docker pull coredns/coredns:1.6.7 #修改tag docker tag kubesphere/kube-apiserver:v1.18.6 k8s.gcr.io/kube-apiserver:v1.18.6 docker tag kubesphere/kube-controller-manager:v1.18.6 k8s.gcr.io/kube-controller-manager:v1.18.6 docker tag kubesphere/kube-scheduler:v1.18.6 k8s.gcr.io/kube-scheduler:v1.18.6 docker tag kubesphere/kube-proxy:v1.18.6 k8s.gcr.io/kube-proxy:v1.18.6 docker tag kubesphere/pause:3.2 k8s.gcr.io/pause:3.2 docker tag azhu/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0 docker tag coredns/coredns:1.6.7 k8s.gcr.io/coredns:1.6.7
3、使用kubeadm init命令对集群初始化,可以直接用命令行初始化,也可以用配置文件的形式初始化。初始化时如果指定了国内镜像仓库可以自动去拉取所需镜像,如果这里能拉取成功的话第一步是可以不用做的。初始化过程中可以看到依次做了环境检测、镜像拉取、证书配置等操作。命令运行完成后会生成kubeadmin join命令用于加入集群,一定要记录下来,后续加入集群都是使用那个命令,如果忘了话可以重新生成,后面会讲到。如果集群初始化失败可以运行kubeadm reset进行重置,然后重新初始化。
#配置文件初始化方式,配置文件需要添加pod网段等信息 kubeadm config print init-defaults > kubeadm-config.yaml kubeadm init --config=kubeadm-config.yaml #命令行初始化方式 kubeadm init --pod-network-cidr=192.168.0.0/16 --service-cidr=172.10.0.0/16 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version 1.18.6 # --service-cidr:指定service网段 # --pod-network-cidr:指定K8S POD网段,不同的网络插件默认网段不一样 # --iamge-repository:指定国内镜像仓库地址 # --kuberntes-version 1.18.6:指定需要的版本 # --ignore-preflight-errors:忽略因为系统配置SWAP而产生的错误 #重置初始化状态 #kubeadm reset
4、复制配置文件到用户HOME目录
# 非root用户执行下面命令复制配置文件 mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config # root用户可以直接用下面的命令 export KUBECONFIG=/etc/kubernetes/admin.conf
5、验证K8S集群服务状态,看到是NotReady状态,这是因为还没有配置CNI容器网络接口(Container Network Interface),CNI标准要求节点与节点网络互通、节点与容器之间网络互通、容器与容器之间网络互通。
kubectl get nodes
6、K8S支持多种CNI,从1.18开始推荐使用calico而不再是flannel。如果还想继续使用flannel的话可以通过https://github.com/coreos/flannel页面下方的Deploying flannel manually找到一键部署命令(如果在初始化集群的时候修改过pod-network-cidr网络地址,那么需要先修改kube-flannel.yml里的相关地址再去apply,否则默认使用10.244网段)。calico网页上提供了安装方式(https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremises)运行完成后等一会儿,然后运行docker images命令可以看到CNI的镜像
#cacico安装方法 wget https://docs.projectcalico.org/manifests/calico.yaml kubectl apply -f calico.yaml #flannel安装方法 kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
7、查看kube-system这个名称空间下的pods信息,K8S组件默认都在该名称空间下。验证flannel镜像是否拉取成功以及node状态是否正常,都没问题的话Master节点就安装完成了
kubectl get ns #查看所有namespace kubectl get pods -n kube-system #查看指定namespace下的pods kubectl get node #查看状态是否为Ready
四、kubeadm部署K8S Node
1、使用kubeadm join命令将新节点加入集群,如果命令提示no route to host请查看Master的iptables规则是否清空
kubeadm join 192.168.145.185:6443 --token 3g743d.h9t34niq0k3n73sx --discovery-token-ca-cert-hash sha256:ac13fc140298b3665e0436d353d94fed494e36b52485df532b4bb719bd6d2e11 --ignore-preflight-errors=Swap #这里的IP就是第一个主节点IP
2、由于kubeadm生成的token是有过期时间的,可以通过以下方式重新创建node节点和master节点的token
#重新生成node节点token kubectl get secret -n kube-system #查看当前环境中的token和有效时间 kubectl get secret -n kube-system bootstrap-token0-5wfwud -o yaml #查看bootstrap token信息,其中expiration就是过期时间,用base64命令解密可以看到准确时间 echo "expiration里的字符串" | base64 --decode #查看过期时间 kubectl delete secret -n kube-system bootstrap-token0-5wfwud #删除过期token kubeadm token create --print-join-command #生成新的node节点密钥 #重新生成master节点token kubeadm init phase upload-certs --upload-certs
3、在主节点使用kubectl get nodes验证状态为Ready,如果提示Not Ready的话需要等node节点的镜像都拉取完毕。显示角色为<none>代表它可以成为其他角色。至此Node节点配置完毕
kubectl get pod -n kube-system -o wide #在master执行此命令查看详情
五、测试K8S集群
在K8S中创建一个pod,然后验证是否正常运行
kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 --type=NodePort kubectl get pod,svc
六、为K8S新加Master节点
1、要新加Master节点需要使用kubeadm init命令上传第一个Master节点的CA证书(这些文件保存在/etc/kubernetes/pki中),命令执行后可以看到证书信息上传到kube-system这个namespace中的提示
kubeadm init phase upload-certs --upload-certs
2、上面命令除了上传证书到namespace中,还会生成一串key。这个key两小时后会失效,失效后可以重新生成。找到集群初始化后的kubeadm join命令,使用--certificate-key选项加上这串key
kubeadm join 192.168.111.120:6443 --token 1wr731.odgs0fl0v31k7x54 --control-plane --discovery-token-ca-cert-hash sha256:2b2e660aa718de3ae492013faea779ecb220d0bf0f703cc03d3268b750e1be97 --certificate-keyc0b2c238f87c7c7safi579012567ce147
3、验证节点
kubectl get nodes
评论