三、集群部署

ip

系统环境

主机名

192.168.130.11

CentOS 7.6

Kube-master

192.168.130.12

CentOS 7.6

Kube-node1

192.168.130.13

CentOS 7.6

Kube-node2

3.1 部署前准备

3.1.1 主机名解析

vim /etc/hosts
192.168.130.11 kube-master
192.168.130.12 kube-node1
192.168.130.13 kube-node2

3.1.2 时间同步

yum install chrony
systemctl start chronyd
systemctl enable chronyd

3.1.3 禁用swap

swapoff -a

并且注释/etc/fstab所有与swap相关的行

3.3.4 关闭防火墙

setenforce 0
sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config

systemctl stop firewalld
systemctl disable firewalld

3.3.5 加载ipvs内核模块

安装 IPVS 模块

yum -y install ipvsadm ipset sysstat conntrack libseccomp

设置开机加载配置文件

cat >>/etc/modules-load.d/ipvs.conf<<EOF
ip_vs_dh
ip_vs_ftp
ip_vs
ip_vs_lblc
ip_vs_lblcr
ip_vs_lc
ip_vs_nq
ip_vs_pe_sip
ip_vs_rr
ip_vs_sed
ip_vs_sh
ip_vs_wlc
ip_vs_wrr
nf_conntrack_ipv4
EOF

设置开机加载 IPVS 模块

systemctl enable systemd-modules-load.service   # 设置开机加载内核模块
lsmod | grep -e ip_vs -e nf_conntrack_ipv4      # 重启后检查 ipvs 模块是否加载

3.3.6 下载 Docker 和 K8S

设置docker源

curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

设置k8s源

cat >>/etc/yum.repos.d/kuberetes.repo<<EOF
[kuberneres]
name=Kubernetes
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

安装 docker-ce 和 kubernetes

yum install docker-ce kubelet kubectl kubeadm -y
systemctl start docker
systemctl enable docker
systemctl enable kubelet

3.3.7 设置内核及k8s参数

设置内核参数

cat >>/etc/sysctl.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

设置kubectl忽略swap,使用ipvs

cat >/etc/sysconfig/kubelet<<EOF
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
KUBE_PROXY_MODE=ipvs
EOF

3.2 部署Master

本小节的所有操作,只在Master上进行

3.2.1 拉取镜像

宿主机最好能访问国外资源,在kubeadm init 在初始化的时候会到谷歌的 docker hub 拉取镜像,如果宿主机测试无法访问 k8s.gcr.io

  • 提前拉取初始化需要的镜像
kubeadm config images pull

k8s离线部署初始化如可使用本地镜像_初始化

  • 拉取其他源镜像
docker pull mirrorgooglecontainers/kube-apiserver:v1.14.2
docker pull mirrorgooglecontainers/kube-controller-manager:v1.14.2
docker pull mirrorgooglecontainers/kube-scheduler:v1.14.2
docker pull mirrorgooglecontainers/kube-proxy:v1.14.2
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd:3.3.10
docker pull coredns/coredns:1.3.1


利用`kubeadm config images list` 查看需要的docker image name

k8s.gcr.io/kube-apiserver:v1.14.2
k8s.gcr.io/kube-controller-manager:v1.14.2
k8s.gcr.io/kube-scheduler:v1.14.2
k8s.gcr.io/kube-proxy:v1.14.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1

# 修改tag

docker tag docker.io/mirrorgooglecontainers/kube-apiserver:v1.14.2 k8s.gcr.io/kube-apiserver:v1.14.2
docker tag docker.io/mirrorgooglecontainers/kube-scheduler:v1.14.2 k8s.gcr.io/kube-scheduler:v1.14.2
docker tag docker.io/mirrorgooglecontainers/kube-proxy:v1.14.2 k8s.gcr.io/kube-proxy:v1.14.2
docker tag docker.io/mirrorgooglecontainers/kube-controller-manager:v1.14.2 k8s.gcr.io/kube-controller-manager:v1.14.2
docker tag docker.io/mirrorgooglecontainers/etcd:3.3.10  k8s.gcr.io/etcd:3.3.10
docker tag docker.io/mirrorgooglecontainers/pause:3.1  k8s.gcr.io/pause:3.1
docker tag docker.io/coredns/coredns:1.3.1  k8s.gcr.io/coredns:1.3.1

docker rmi `docker images |grep docker.io/ |awk '{print $1":"$2}'`

3.2.2 初始化Master

使用 kubeadm 初始化 k8s 集群

kubeadm init \
    --apiserver-advertise-address=0.0.0.0 \
    --apiserver-bind-port=6443 \
    --kubernetes-version=v1.18.5 \
    --pod-network-cidr=10.10.0.0/16 \
    --service-cidr=172.31.0.0/16 \
    --service-dns-domain=pansn.local \
    --image-repository=k8s.gcr.io \
    --ignore-preflight-errors=swap \
  --token-ttl=0

k8s离线部署初始化如可使用本地镜像_k8s离线部署初始化如可使用本地镜像_02

下面是最后执行成功显示的结果,需要保存这个执行结果,以让 node 节点加入集群

k8s离线部署初始化如可使用本地镜像_docker_03

注意最后一行的kubeadm join命令,后面在加入node节点时要用

  • 如果初始化过程被中断可以使用下面命令来恢复
kubeadm reset
  • 最好以普通用户的身份运行下面的命令
# 在当前用户家目录下创建.kube目录并配置访问集群的config 文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

3.2.3 部署 flannel 网络插件

  • 下载falannel.yml文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  • 修改配置
[root@kube-master opt]# vim kube-flannel.yml

k8s离线部署初始化如可使用本地镜像_k8s离线部署初始化如可使用本地镜像_04

改成之前初始化时pod-network-cidr选项对应的值

  • 部署 flannel 网络插件
[root@kube-master opt]# kubectl apply -f kube-flannel.yml

k8s离线部署初始化如可使用本地镜像_bash_05

3.2.4 检查k8s集群状态

  • 查看 kube-system 命名空间中运行的 pods
kubectl get pods -n kube-system

k8s离线部署初始化如可使用本地镜像_bash_06

  • 查看 k8s 集群组件的状态
kubectl get ComponentStatus

k8s离线部署初始化如可使用本地镜像_bash_07

kubectl get nodes

k8s离线部署初始化如可使用本地镜像_k8s离线部署初始化如可使用本地镜像_08

3.2.5 配置命令补全

yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

3.3 部署node节点

本小节的所有的操作,只在 Node 节点上进行

3.3.1 加入集群

加入集群,注意在命令尾部加上 –ignore-preflight-errors=Swap ,以忽略 k8s 对主机 swap 的检查(k8s为了性能所以要求进制 swap

kubeadm join 192.168.130.11:6443  \
       --ignore-preflight-errors=swap \
     --token 70hwi7.omp6t2nfwfsg4y87 \
    --discovery-token-ca-cert-hash sha256:f4b7ea9af19c749e3e6447ceb8803c8c1d563fc3e2452e7d4422246ad4dfb0b4

返回结果,表示加入集群成功

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

k8s离线部署初始化如可使用本地镜像_docker_09

编写最后命令写成脚本以便后续使用

3.3.2 查看进度

  • node查看镜像

当 node 节点加入 K8S 集群中后,Master 会调度到 Node 节点上一些组件,用于处理集群事务,这些组件没有下载完成之前 Node 节点在集群中还是未就绪状态

在 node 执行下面命令,可以查看镜像的下载进度,下面是最终结果显示

最终显示结果

[root@kube-node1 ~]# docker image ls
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/kube-proxy    v1.18.5             a1daed4e2b60        11 days ago         117MB
quay.io/coreos/flannel   v0.12.0-amd64       4e9f801d2217        3 months ago        52.8MB
k8s.gcr.io/pause         3.2                 80d28bedfe5d        4 months ago        683kB

可以在 Master 上使用下面命令来查看新加入的节点状态

[root@kube-master ~]# kubectl get nodes 
NAME          STATUS   ROLES    AGE     VERSION
kube-master   Ready    master   82m     v1.18.5
kube-node1    Ready    <none>   7m14s   v1.18.5
kube-node2    Ready    <none>   4m17s   v1.18.5
  • node查看集群组件状态
kubectl get pods -n kube-system -o wide

k8s离线部署初始化如可使用本地镜像_k8s离线部署初始化如可使用本地镜像_10

问题汇总:

K8s集群初始化成功后,kubectl get nodes 查看节点信息时报错

k8s离线部署初始化如可使用本地镜像_初始化_11

解决方法:

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

3.3.3 解决镜像下载慢问题

node 节点需要FQ下载镜像太慢,建议使用 docker 镜像的导入导出功能 先将master的三个镜像打包发送到node节点,load后再jion

  • 导出
docker image save -o /tmp/kube-proxy.tar k8s.gcr.io/kube-proxy
docker image save -o /tmp/flannel.tar quay.io/coreos/flannel
docker image save -o /tmp/pause.tar k8s.gcr.io/pause
  • 导入
docker image load -i /tmp/kube-proxy.tar
docker image load -i /tmp/pause.tar
docker image load -i /tmp/flannel.tar

参考