使用Kubeadm部署K8S v1.17.2集群部署详细步骤

kubernetes组件架构图:

使用Kubeadm部署K8S v1.17.2集群部署详细步骤

 

集群机器

172.16.2.10 k8s-master
172.16.2.11 k8s-node1
172.16.2.12 k8s-node2

 #查看Centos版本:

cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core)
##https://www.cnblogs.com/liucx/

#修改主机名:

#master节点:
hostnamectl set-hostname k8s-master
#node1节点:
hostnamectl set-hostname k8s-node1
#node2节点:
hostnamectl set-hostname k8s-node2

#修改/etc/hosts文件

cat >> /etc/hosts << EOF
172.16.2.10 k8s-master
172.16.2.11 k8s-node1
172.16.2.12 k8s-node2
EOF

#关闭防火墙和selinux

systemctl stop firewalld && systemctl disable firewalld
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config && setenforce 0

#关闭swap

swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

#Master免密登录其它节点

ssh-keygen
ssh-copy-id -i root@k8s-node1
ssh-copy-id -i root@k8s-node2

#安装依赖包

yum -y  install epel-release
yum -y install  ntpdate  ipvsadm ipset  iptables curl sysstat libseccomp wget 

#同步时间

ntpdate ntp.shu.edu.cn
crontab -e
*/5 * * * * ntpdate ntp5.aliyun.com

#修改iptables相关参数
#RHEL / CentOS 7上的一些用户报告了由于iptables被绕过而导致流量路由不正确的问题。创建/etc/sysctl.d/k8s.conf文件,添加如下内容:

cat <<EOF >  /etc/sysctl.d/k8s.conf
vm.swappiness = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
#使配置生效
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf

#由于ipvs已经加入到了内核的主干,所以为kube-proxy开启ipvs的前提需要加载以下的内核模块:
#在所有的Kubernetes节点执行以下脚本:

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_ipv4
EOF

#执行脚本
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
#上面脚本创建了/etc/sysconfig/modules/ipvs.modules文件,保证在节点重启后能自动加载所需模块。 使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已经正确加载所需的内核模块。

 

#卸载docker旧版本

yum remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine

#安装docker

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce
systemctl start docker && systemctl enable docker

#配置镜像加速器

cat >/etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
EOF
systemctl restart docker

#配置kubernetes的阿里云yun源  

cat > /etc/yum.repos.d/kubernetes.repo  <<EOF
[kubernetes]
name=Kubernetes repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
enabled=1
EOF

 

#安装指定版本kubelet、kubeadm、kubectl
#1.kubelet 在群集中所有节点上运行的核心组件, 用来执行如启动pods和containers等操作。
#2.kubeadm 引导启动k8s集群的命令行工具,用于初始化 Cluster。
#3.kubectl 是 Kubernetes 命令行工具。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
#在所有节点上安装指定版本 kubelet、kubeadm 和 kubectl

yum install -y kubelet-1.17.2 kubeadm-1.17.2 kubectl-1.17.2

#修改docker Cgroup Driver为systemd
#将/usr/lib/systemd/system/docker.service文件中的这一行 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
#修改为 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd
#如果不修改,在添加Node节点时可能会碰到如下错误
# [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd".
# Please follow the guide at https://kubernetes.io/docs/setup/cri/

sed -i "s#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd#g" /usr/lib/systemd/system/docker.service
systemctl daemon-reload
systemctl restart docker

#启动kubelet服务

systemctl enable kubelet && systemctl start kubelet

#Master节点执行初始化

kubeadm init \
    --apiserver-advertise-address=172.16.2.10 \
    --image-repository registry.aliyuncs.com/google_containers \
    --kubernetes-version v1.17.2 \
    --pod-network-cidr=10.244.0.0/16

--apiserver-advertise-address:API服务器将通知它正在监听的IP地址,监听的地址为“0.0.0.0”,即本机所有IP地址。
--apiserver-bind-port:API服务器绑定到的端口。(默认:6443)
--image-repository:Kubenetes默认Registries地址是 k8s.gcr.io,在国内并不能访问 gcr.io,将其指定为阿里云镜像地址:registry.aliyuncs.com/google_containers
--ignore-preflight-errors:将错误显示为警告的检查列表进行忽略。例如:“IsPrivilegedUser,Swp”。Value 'all'忽略所有检查中的错误。
--pod-network-cidr:指定pod网络的IP地址范围。如果设置,控制平面将为每个节点自动分配CIDRs。
--service-cidr:为service VIPs使用不同的IP地址。(默认“10.96.0.0/12”)

#上面日志会生成以下信息(重要记录)

kubeadm join 172.16.2.10:6443 --token a63pm3.gqg0nc7dphukxohv \
    --discovery-token-ca-cert-hash sha256:5bfcffc542f4aecdecb1ad5250d1ac6fe202d0d36433065eb31a83dbe56733eb 
#默认token的有效期为24小时,当过期之后,该token就不可用了。
#如果后续有nodes节点加入,解决方法如下:重新生成新的token ==> kubeadm token create

 #根据上面的输出提示进行操作 

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

#执行完之后,再查看nodes节点时,结果如下:
kubectl get nodes
#可以看出master的状态是未就绪(NotReady),之所以是这种状态是因为还缺少一个附件flannel或者Calico,没有网络各Pod是无法通信的。
#也可以通过检查组件的健康状态
kubectl get componentstatus #componentstatus可简写为cs

 

#Node节点加入集群

#使用kubeadm join 注册Node节点到Matser

#kubeadm join 的内容,在上面kubeadm init (kubeadm init输出结果的最后写明了) 已经生成好了
#此操作在node节点上进行操作

kubeadm join 172.16.2.10:6443 --token a63pm3.gqg0nc7dphukxohv \
    --discovery-token-ca-cert-hash sha256:5bfcffc542f4aecdecb1ad5250d1ac6fe202d0d36433065eb31a83dbe56733eb 

 

#安装网络插件
#一般的网络无法访问quay.io,可以找国内的镜像源,或者从docker hub上拉取flannel的镜像。
#手动拉取flannel镜像
#在集群的所有机器上操作,手动拉取flannel的docker镜像

docker pull easzlab/flannel:v0.11.0-amd64
# 修改镜像名称
docker tag easzlab/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.11.0-amd64
docker rmi easzlab/flannel:v0.11.0-amd64
docker images

#安装flannel
#此操作在Master节点 上进行
#下载flannel资源配置清单

wget  https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml 

#部署完成后,我们可以通过 kubectl get 重新检查 Pod 的状态:

kubectl get pod -n kube-system -o wide
#可以看到,所有的系统 Pod 都成功启动了,而刚刚部署的flannel网络插件则在 kube-system 下面新建了一个名叫kube-flannel-ds-amd64-lkf2f的 Pod,一般来说,这些 Pod 就是容器网络插件在每个节点上的控制组件。
再次查看master和node节点状态已经为ready状态
kubectl get nodes 
[root@k8s-master ~]# kubectl get pods --all-namespaces  #查看所有名称空间的pod,同时可以看到flannel已经正常启动    
NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE
default       nginx-86c57db685-q884q               1/1     Running   0          7m3s
kube-system   coredns-9d85f5447-jb8l2              1/1     Running   0          3h38m
kube-system   coredns-9d85f5447-zx2j5              1/1     Running   0          3h38m
kube-system   etcd-k8s-master                      1/1     Running   0          3h38m
kube-system   kube-apiserver-k8s-master            1/1     Running   0          3h38m
kube-system   kube-controller-manager-k8s-master   1/1     Running   0          3h38m
kube-system   kube-flannel-ds-amd64-2plp7          1/1     Running   0          48m
kube-system   kube-flannel-ds-amd64-cnlbh          1/1     Running   0          48m
kube-system   kube-flannel-ds-amd64-zr88r          1/1     Running   0          48m
kube-system   kube-proxy-44fpd                     1/1     Running   0          179m
kube-system   kube-proxy-5lrvp                     1/1     Running   0          3h38m
kube-system   kube-proxy-c64px                     1/1     Running   0          179m
kube-system   kube-scheduler-k8s-master            1/1     Running   0          3h38m
[root@k8s-master ~]# kubectl get pods -n kube-system #查看名称空间为kube-system的pod
NAME READY STATUS RESTARTS AGE
coredns-9d85f5447-jb8l2 1/1 Running 0 3h37m
coredns-9d85f5447-zx2j5 1/1 Running 0 3h37m
etcd-k8s-master 1/1 Running 0 3h37m
kube-apiserver-k8s-master 1/1 Running 0 3h37m
kube-controller-manager-k8s-master 1/1 Running 0 3h37m
kube-flannel-ds-amd64-2plp7 1/1 Running 0 47m
kube-flannel-ds-amd64-cnlbh 1/1 Running 0 47m
kube-flannel-ds-amd64-zr88r 1/1 Running 0 47m
kube-proxy-44fpd 1/1 Running 0 178m
kube-proxy-5lrvp 1/1 Running 0 3h37m
kube-proxy-c64px 1/1 Running 0 178m
kube-scheduler-k8s-master 1/1 Running 0 3h37m

#测试Kubernetes集群

 此操作在master节点 K8S00上进行

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get services nginx
#kubernetes集群可能出现pod或node节点状态异常等情况,可以通过查看日志分析错误原因
#查看pod日志
kubectl -n kube-system logs -f <pod name>
#查看pod运行状态及事件
kubectl -n kube-system describe pods <pod name>

使用Kubeadm部署K8S v1.17.2集群部署详细步骤

 

完成!

上一篇:k8s的CNI网络插件-flannel


下一篇:flannel CrashLoopBackOff原因