安装与重装k8s 1.15.0


准备

系统配置

 1 # 两台CentOS 7.6主机修改主机名
 2 # 对于管理面节点
 3 echo “node1” > /etc/hostname
 4 hostnamectl set-hostname node1
 5 # 对于数据面节点
 6 echo "node2" > /etc/hostname
 7 hostnamectl set-hostname "node2"
 8 
 9 # 安装nslookup和ifconfig
10 # nslookup
11 yum install -y bind-utils
12 # ifconfig
13 yum install -y net-tools.x86_64
14 
15 # 禁用防火墙
16 systemctl stop firewalld
17 systemctl disable firewalld
18 
19 # 禁用SELINUX
20 setenforce 0
21 vi /etc/selinux/config
22 SELINUX=disabled
23 
24 # 创建/etc/sysctl.d/k8s.conf文件,添加如下内容
25 net.bridge.bridge-nf-call-ip6tables = 1
26 net.bridge.bridge-nf-call-iptables = 1
27 net.ipv4.ip_forward = 1
28 # 使修改生效
29 modprobe br_netfilter
30 sysctl -p /etc/sysctl.d/k8s.conf

配置kube-proxy开启ipvs的前置条件

 1 # 所有节点上执行以下脚本
 2 cat > /etc/sysconfig/modules/ipvs.modules <<EOF
 3 #!/bin/bash
 4 modprobe -- ip_vs
 5 modprobe -- ip_vs_rr
 6 modprobe -- ip_vs_wrr
 7 modprobe -- ip_vs_sh
 8 modprobe -- nf_conntrack_ipv4
 9 EOF
10 chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
11 yum install -y ipset
12 yum install -y ipvsadm

使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已经正确加载所需的内核模块。

安装Docker并修改docker cgroup driver为systemd

 1 yum install -y yum-utils \
 2   device-mapper-persistent-data \
 3   lvm2
 4 yum install -y wget
 5 
 6 cd /etc/yum.repos.d/
 7 wget https://download.docker.com/linux/centos/docker-ce.repo
 8 
 9 yum install -y --setopt=obsoletes=0   docker-ce-18.09.7-3.el7
10          
11 systemctl start docker
12 systemctl enable docker
13 
14 # 修改各个节点上docker的cgroup driver为systemd,默认是cgroupfs。
15 # 创建或修改/etc/docker/daemon.json
16 {
17   "exec-opts": ["native.cgroupdriver=systemd"]
18 }
19 # 重启Docker
20 systemctl restart docker
21 # 查看cgroup driver
22 docker info | grep Cgroup

使用kubeadm部署k8s并纳管节点

安装kubelet、kubeadm和kubectl

 1 # 配置kubeadm源
 2 vim /etc/yum.repos.d/kubernetes.repo
 3 
 4 [kubernetes]
 5 name=Kubernetes
 6 baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
 7 enabled=1
 8 gpgcheck=0
 9 repo_gpgcheck=0
10 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
11        http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
12 
13 # 安装kubelet、kubeadm 和 kubectl 1.15.0版本
14 yum makecache fast
15 yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0

关闭系统的Swap

1 swapoff -a

修改/etc/fstab文件,注释掉SWAP的自动挂载

使用free -m确认swap已经关闭

swappiness参数调整,修改/etc/sysctl.d/k8s.conf添加下面一行

1 vm.swappiness=0

执行sysctl -p /etc/sysctl.d/k8s.conf使修改生效。

使用kubeadm init初始化集群

 1 # 在各节点开机启动kubelet服务
 2 systemctl enable kubelet.service
 3 
 4 kubeadm.yaml
 5 apiVersion: kubeadm.k8s.io/v1beta2
 6 kind: InitConfiguration
 7 localAPIEndpoint:
 8   advertiseAddress: 192.168.124.25
 9   bindPort: 6443
10 nodeRegistration:
11   taints:
12   - effect: PreferNoSchedule
13     key: node-role.kubernetes.io/master
14 ---
15 apiVersion: kubeadm.k8s.io/v1beta2
16 kind: ClusterConfiguration
17 kubernetesVersion: v1.15.0
18 networking:
19   podSubnet: 10.244.0.0/16
20 
21 # 拉取镜像
22 # k8s.gcr.io/kube-apiserver:v1.15.0
23 # k8s.gcr.io/kube-controller-manager:v1.15.0
24 # k8s.gcr.io/kube-scheduler:v1.15.0
25 # k8s.gcr.io/kube-proxy:v1.15.0
26 # k8s.gcr.io/pause:3.1
27 # k8s.gcr.io/etcd:3.3.10
28 # k8s.gcr.io/coredns:1.3.1
29 
30 # 执行如下脚本
31 #!/bin/bash
32 images=(kube-apiserver:v1.15.0 kube-controller-manager:v1.15.0 kube-scheduler:v1.15.0
33 kube-proxy:v1.15.0 pause:3.1 etcd:3.3.10 coredns:1.3.1)
34 for imageName in ${images[@]} ; do
35     docker pull registry.aliyuncs.com/google_containers/$imageName
36     docker tag registry.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
37     docker rmi registry.aliyuncs.com/google_containers/$imageName
38 done
39 
40 # 在master上执行下面的命令
41 kubeadm init --config kubeadm.yaml --ignore-preflight-errors=Swap
42 
43 # master配置常规用户如何使用kubectl访问集群
44 mkdir -p $HOME/.kube
45 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
46 sudo chown $(id -u):$(id -g) $HOME/.kube/config
47 # 配置原因是,k8s集群默认需要加密方式访问。把k8s集群的安全配置文件保存到当前用户的.kube目录下,kubectl默认会使用这个目录下的授权信息访问k8s集群。

安装容器网络flannel

1 docker pull quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64
2 docker tag quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.11.0-amd64
3 docker rmi quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64
4 
5 mkdir -p ~/k8s/
6 cd ~/k8s
7 curl -O https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
8 kubectl create -f kube-flannel.yml

纳管节点

1 kubeadm join 192.168.124.25:6443 --token wjasin.yxpd3l1stau9wp10 \
2     --discovery-token-ca-cert-hash sha256:8beba8c0f153d9e96772b0ed493a0bc0fccaef3a0782bd6dedd5b029b3a10ea5 \
3  --ignore-preflight-errors=Swap
4 
5 # 从master上获取join token
6 kubeadm token create --print-join-command

kube-proxy开启ipvs

修改ConfigMap的kube-system/kube-proxy中的config.conf,mode: “ipvs”

1 kubectl edit cm kube-proxy -n kube-system

把mode改成ipvs。

之后重启各个节点上的kube-proxy pod

1 kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'

数据面节点上下载k8s.gcr.io/pause:3.1和kube-proxy:v1.15.3

1 docker pull registry.aliyuncs.com/google_containers/pause:3.1
2 docker tag registry.aliyuncs.com/google_containers/pause:3.1 k8s.gcr.io/pause:3.1
3 docker rmi registry.aliyuncs.com/google_containers/pause:3.1
4 
5 docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.15.0
6 docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.15.0 k8s.gcr.io/kube-proxy:v1.15.0
7 docker rmi registry.aliyuncs.com/google_containers/kube-proxy:v1.15.0

查看所有的Pod

kubectl get pod --all-namespaces -o wide

发现两个节点各自有一个flannel网络插件和kube-proxy对应的Pod。

Master节点设置成不可调度(不把业务Pod调度到管理面)

默认情况下,Master节点打的污点是node-role.kubernetes.io/master:PreferNoSchedule,表示尽量不要调度,实在没有地方调度的情况下,才考虑可以调度过来。

1 # 去掉该污点
2 [root@node1 deploy]# kubectl taint nodes node1 node-role.kubernetes.io/master-
3 node/node1 untainted
4 # 打上不可调度的污点
5 [root@node1 deploy]# kubectl taint nodes node1 node-role.kubernetes.io/master=:NoSchedule
6 node/node1 tainted

因虚拟机IP地址改变而重装k8s和纳管

卸载k8s

k8s_uninstall.sh

管理面节点

 1 kubeadm reset -f
 2 modprobe -r ipip
 3 rm -rf ~/.kube/
 4 rm -rf /etc/kubernetes/
 5 rm -rf /etc/systemd/system/kubelet.service.d
 6 rm -rf /etc/systemd/system/kubelet.service
 7 #rm -rf /usr/bin/kube*
 8 rm -rf /etc/cni
 9 rm -rf /opt/cni
10 rm -rf /var/lib/etcd
11 rm -rf /var/etcd

数据面节点

 1 kubeadm reset -f
 2 systemctl stop kubelet
 3 systemctl stop docker
 4 rm -rf /var/lib/cni/
 5 rm -rf /var/lib/kubelet/*
 6 rm -rf /etc/cni/
 7 ifconfig cni0 down
 8 ifconfig flannel.1 down
 9 ifconfig docker0 down
10 ip link delete cni0
11 ip link delete flannel.1
12 systemctl start docker
13 systemctl start kubelet

重装k8s

k8s_reinstall.sh

 1 # 修改管理面的主机名
 2 echo "master" > /etc/hostname
 3 hostnamectl set-hostname master
 4 
 5 # 修改kubeadm.yaml和/etc/hosts里面的ip
 6 hostIp=$(ifconfig ens33 | grep "inet " | awk '{print $2}')
 7 sed -i "s/advertiseAddress:.*/advertiseAddress: ${hostIp}/" ../yaml/kubeadm.yaml
 8 
 9 # 初始化集群
10 kubeadm init --config ../yaml/kubeadm.yaml --ignore-preflight-errors=Swap
11 
12 # 添加kubectl执行权限
13 mkdir -p $HOME/.kube
14 cp /etc/kubernetes/admin.conf $HOME/.kube/config
15 chown $(id -u):$(id -g) $HOME/.kube/config
16 
17 # 安装容器网络
18 kubectl create -f ../yaml/kube-flannel.yml

纳管节点

add_node.sh

1 # 修改hostname
2 hostIp=$(ifconfig ens33 | grep "inet " | awk '{print $2}')
3 echo "${hostIp}" > /etc/hostname
4 hostnamectl set-hostname ${hostIp}
5 
6 # 纳管当前节点
7 # kubeadm join master_ip:6443 --token ...
8 kubeadm join 192.168.1.7:6443 --token vtee5p.mln1qrk82ml2t7xe \
9 --discovery-token-ca-cert-hash sha256:8dad8ae7ce1bbe79a704b7f23213bf55f5116da7fd4d35e0ee2ec7ae91338316

效果图

相关