环境准备
主机名
WanIP
LanIP
角色
应用
配置
master01
10.0.0.200
172.16.1.200
master
kubectl、apiserver、 scheduler、controller、 etcd、kubelet、docker、 kube-proxy
1h2g
node01
10.0.0.201
172.16.1.201
node
kubelet、docker、kubeproxy、proxy
1h2g
node02
10.0.0.202
172.16.1.202
node
kubelet、docker、kubeproxy、proxy
1h2g
node03
10.0.0.203
172.16.1.203
node
kubelet、docker、kubeproxy、proxy
2h4g
IP规划
三种Service
IP
PodIP
10.2.0.0
ClusterIP
10.1.0.0
NodeIP
10.0.0.0
基础环境优化
注意:四个节点都操作
1.配置kubelet配置文件,使用系统自带的Cgroup驱动和禁用swap
1 2 3 4 5 6 7 8 9 10 [root@master ~]# cat >/etc/sysconfig/kubelet <<EOF KUBELET_CGROUP_ARGS="--cgroup-driver=systemd" KUBELET_EXTRA_ARGS="--fail-swap-on=false" EOF `注释` KUBELET_CGROUP_ARGS="--cgroup-driver=systemd" KUBELET_EXTRA_ARGS="--fail-swap-on=false"
2.内核参数调优
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 [root@master ~]# cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1 vm.swappiness=0 fs,file-max=52706963 fs.nr_open=52706963 EOF `注释` net.bridge.bridge-nf-call-ip6tables=1 net.bridge.bridge-nf-call-iptables=1 net.ipv4.ip_forward=1 vm.swappiness=0 fs,file-max=52706963 fs.nr_open=52706963
3.更改docker源
1 2 3 4 5 6 7 8 9 10 11 12 [root@master ~]# cat > /etc/yum.repos.d/docker-ce.repo <<"EOF" [docker-ce-stable] name=Docker CE Stable - $basearch baseurl=https://download.docker.com/linux/centos/$releasever /$basearch /stable enabled=1 gpgcheck=1 gpgkey=https://download.docker.com/linux/centos/gpg EOF [root@master ~]# sed -i 's+download.docker.com+mirrors.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
4.安装时间同步服务
1 2 3 [root@master ~]# yum install -y chrony [root@master ~]# systemctl start chronyd [root@master ~]# systemctl enable chronyd
5.关闭swap
1 2 3 4 5 6 7 8 9 [root@master ~]# swapoff -a && sysctl -w vm.swappiness=0 [root@master ~]# sed -i '/swap/d' /etc/fstab [root@master ~]# free -h total used free shared buff/cache available Mem: 1.9G 95M 1.6G 9.5M 283M 1.7G Swap: 0B 0B 0B
6.加载ipvs模块
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 [root@master ~]# 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 [root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules [root@master ~]# source /etc/sysconfig/modules/ipvs.modules [root@master ~]# lsmod|grep -e 'ip_vs' -e 'nf_conntrack_ipv' nf_conntrack_ipv4 15053 0 nf_defrag_ipv4 12729 1 nf_conntrack_ipv4 ip_vs_sh 12688 0 ip_vs_wrr 12697 0 ip_vs_rr 12600 0 ip_vs 145497 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr nf_conntrack 133095 2 ip_vs,nf_conntrack_ipv4 libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
安装docker
注意:所有节点执行
1.安装指定版本docekr和容器运行时
1 2 3 [root@master ~]# yum install -y docker-ce-19.03.15 docker-ce-cli-19.03.15 containerd.io `容器运行时,Docker、containerd、CRI-O`
2.启动和开机自启
1 2 [root@master ~]# systemctl start docker [root@master ~]# systemctl enable docker
3.添加docker镜像加速
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 [root@master ~]# cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors": [ "https://docker.1panel.live", "https://dockercf.jsdelivr.fyi", "https://docker-cf.registry.cyou", "https://docker.chenby.cn", "https://docker.jsdelivr.fyi", "https://docker.m.daocloud.io", "https://docker.m.daocloud.io", "https://docker.mirrors.sjtug.sjtu.edu.cn", "https://docker.mirrors.ustc.edu.cn", "https://docker.nju.edu.cn", "https://dockerproxy.com", "https://docker.rainbond.cc", "https://docker.registry.cyou", "https://dockertest.jsdelivr.fyi", "https://hub-mirror.c.163.com", "https://hub.rat.dev/", "https://mirror.aliyuncs.com", "https://mirror.baidubce.com", "https://mirror.iscas.ac.cn", "https://registry.docker-cn.com" ] } EOF `"exec-opts" : ["native.cgroupdriver=systemd" ], `#镜像加速使用系统Cgroup驱动
4.重启docerk
1 2 [root@master ~]# systemctl daemon-reload [root@master ~]# systemctl restart docker
安装kubeadm
注意:所有节点执行
1.更换kubernetes的yum源
1 2 3 4 5 6 7 8 9 cat <<"EOF" > /etc/yum.repos.d/kubernetes.repo[kubernetes] name=Kubernetes baseurl=https://mirrors.huaweicloud.com/kubernetes/yum/repos/kubernetes-el7-$basearch enabled=1 gpgcheck=1 repo_gpgcheck=0 gpgkey=https://mirrors.huaweicloud.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.huaweicloud.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
2.下载指定版本kubernetes
1 2 3 4 5 [root@master ~]# yum install kubelet-1.19.3 kubeadm-1.19.3 kubectl-1.19.3 ipvsadm -y `kubelet`: node节点容器运行时的控制器 `kubeadm`: 做k8s集群 kubectl k8s的命令客户端 `ipvsadm`: 加载ipvs模块
3.启动并加入开机自启
1 2 [root@master ~]# systemctl start kubelet [root@master ~]# systemctl enable kubelet
初始化集群
:dango:注意:仅master节点执行
步骤1-3都是master节点执行
1.初始化集群
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [root@master ~]# kubeadm init \ --apiserver-advertise-address=10.0.0.200 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version=v1.19.3 \ --service-cidr=10.1.0.0/16 \ --pod-network-cidr=10.2.0.0/16 \ --service-dns-domain=cluster.local \ --ignore-preflight-errors=Swap \ --ignore-preflight-errors=NumCPU `注释` `--apiserver-advertise-address=10.0.0.200` `--service-cidr=10.1.0.0/16` `--pod-network-cidr=10.2.0.0/16` `--service-dns-domain=cluster.local` `--ignore-preflight-errors=Swap` `--ignore-preflight-errors=NumCPU` `ClusterIP`: 用于构建容器化应用的内部通信网络,作为POD的负载均衡
保存token
1 2 3 4 5 6 7 8 9 10 11 12 13 14 `初始化成功后会输入如下,你的和我的不一样,注意保存,24h后会消失` 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 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: kubeadm join 10.0.0.200:6443 --token ao4unc.i520imoy7frmmucj \ --discovery-token-ca-cert-hash sha256:77e1fdf379200e1e377304865da17a4f35212955eaf331d2df736c452a2e82f8
!!! 到这一步前面没报错就可以打快照,万一后面出错方便回滚,建议所有节点都可以打一次,如果报错可以回滚到同一起始点
!! 如果时间太久忘记加入令牌的命令,执行命令
kubeadm token create --print-join-command
获取新的join令牌
2.创建配置文件目录
1 2 3 4 [root@master ~]# mkdir -p $HOME /.kube [root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME /.kube/config [root@master ~]# sudo chown $(id -u):$(id -g) $HOME /.kube/config `直接复制上面的三条输出`
3.查看k8s集群节点
1 2 3 [root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady master 11m v1.19.3
4.其他node节点加入集群
注意:这里是3个node节点执行 复制自己的,含有token的命令,不要复制我的
1 2 3 4 5 6 7 8 9 10 [root@node01 ~]# kubeadm join 10.0.0.200:6443 --token ao4unc.i520imoy7frmmucj \ --discovery-token-ca-cert-hash sha256:77e1fdf379200e1e377304865da17a4f35212955eaf331d2df736c452a2e82f8 [root@node02 ~]# kubeadm join 10.0.0.200:6443 --token ao4unc.i520imoy7frmmucj \ --discovery-token-ca-cert-hash sha256:77e1fdf379200e1e377304865da17a4f35212955eaf331d2df736c452a2e82f8 [root@node03 ~]# kubeadm join 10.0.0.200:6443 --token ao4unc.i520imoy7frmmucj \ --discovery-token-ca-cert-hash sha256:77e1fdf379200e1e377304865da17a4f35212955eaf331d2df736c452a2e82f8 ··· Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
5.查看k8s集群
去master节点看
1 2 3 4 5 6 7 [root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady master 17m v1.19.3 node01 NotReady <none> 3m12s v1.19.3 node02 NotReady <none> 3m32s v1.19.3 node03 NotReady <none> 3m27s v1.19.3 `看到四个节点NotReady即OK,因为还未配置网络,不能跨主机通信`
6.设置Kube-proxy使用ipvs模式
1 2 3 4 5 `k8s默认使用的是iptables防火墙,可以修改成性能更高的ipvs模式,该模式LVS也在使用` [root@master01 ~]# kubectl edit cm kube-proxy -n kube-system mode: "" --> mode: "ipvs"
7.查看指定名称空间中pod相信信息
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 [root@master ~]# kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE coredns-6d56c8448f-spslt 0/1 Pending 0 26m coredns-6d56c8448f-x5lqj 0/1 Pending 0 26m etcd-master 1/1 Running 0 26m kube-apiserver-master 1/1 Running 0 26m kube-controller-manager-master 1/1 Running 0 26m kube-proxy-qmbtd 1/1 Running 0 26m kube-proxy-sqnbb 1/1 Running 0 12m kube-proxy-t7hcw 1/1 Running 0 12m kube-proxy-xzv7f 1/1 Running 0 12m kube-scheduler-master 1/1 Running 0 26m `状态没异常即可,除Pending和Running之外的状态都是不正常的,检查是否步骤出错` `coredns-6d56c8448f-spslt` `coredns-6d56c8448f-x5lqj` `etcd-master` `kube-apiserver-master` `kube-controller-manager-master` `kube-proxy-qmbtd` `kube-proxy-sqnbb` `kube-proxy-t7hcw` `kube-proxy-xzv7f` `kube-scheduler-master`
8.查看指定名称空间中pod详细信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 [root@master ~]# kubectl get pod -n kube-system -o wide NAME READY STATUS RESTARTS AGE IP coredns-6d56c8448f-spslt 0/1 Pending 0 42m <none> coredns-6d56c8448f-x5lqj 0/1 Pending 0 42m <none> etcd-master 1/1 Running 0 42m 10.0.0.200 kube-apiserver-master 1/1 Running 0 42m 10.0.0.200 kube-controller-manager-master 1/1 Running 0 42m 10.0.0.200 kube-proxy-qmbtd 1/1 Running 0 42m 10.0.0.200 kube-proxy-sqnbb 1/1 Running 0 28m 10.0.0.203 kube-proxy-t7hcw 1/1 Running 0 28m 10.0.0.201 kube-proxy-xzv7f 1/1 Running 0 28m 10.0.0.202 kube-scheduler-master 1/1 Running 0 42m 10.0.0.200 `检查状态是否都是Running,比对下是否步骤有出入`
9.查看名称空间
1 2 3 4 5 6 7 8 9 [root@master ~]# kubectl get namespace NAME STATUS AGE default Active 45m kube-node-lease Active 45m kube-public Active 45m kube-system Active 45m `namespace 可以简写为 ns` [root@master ~]# kubectl get ns
10.重启kube-proxy
1 2 3 4 5 6 7 `删除所有proxy` kubectl get pod -n kube-system|grep 'kube-proxy' |awk '{print "kubectl delete pod -n kube-system "$1}' |bash `#删除单个proxy` kubectl delete pod -n kube-system kube-proxy名字 `例如kube-proxy-qmbtd` `#因为k8会自动拉起停掉的pod,所以删除即可重启`
11.再次检查状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 [root@master ~]# kubectl get pod -n kube-system -o wide NAME READY STATUS RESTARTS AGE IP coredns-6d56c8448f-spslt 0/1 Pending 0 52m <none> coredns-6d56c8448f-x5lqj 0/1 Pending 0 52m <none> etcd-master 1/1 Running 0 52m 10.0.0.200 kube-apiserver-master 1/1 Running 0 52m 10.0.0.200 kube-controller-manager-master 1/1 Running 0 52m 10.0.0.200 kube-proxy-62xz4 1/1 Running 0 47s 10.0.0.203 kube-proxy-gxz9p 1/1 Running 0 35s 10.0.0.202 kube-proxy-sfzzf 1/1 Running 0 37s 10.0.0.201 kube-proxy-vjgc5 1/1 Running 0 49s 10.0.0.200 kube-scheduler-master 1/1 Running 0 52m 10.0.0.200 `检查状态是否异常,如有异常,比对之前步骤,也可查看系统日志报错`
配置flannel
1.修改flannel资源清单
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 `kube-flannel.yml` [root@master ~]# vim kube-flannel.yml net-conf.json: | { "Network" : "10.2.0.0/16" , "EnableNFTables" : false , "Backend" : { "Type" : "vxlan" } } containers: - args: - --ip-masq - --kube-subnet-mgr - --iface=eth0 selector: matchLabels: app: flannel
2.应用flannel资源清单
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 30 31 32 33 [root@master ~]# kubectl apply -f kube-flannel.yml [root@master ~]# kubectl get pod -n kube-flannel NAME READY STATUS RESTARTS AGE kube-flannel-ds-g9drp 0/1 Running 0 6m9s kube-flannel-ds-rcwkv 1/1 Running 0 6m9s kube-flannel-ds-txcn2 1/1 Running 0 6m9s kube-flannel-ds-whd7p 1/1 Running 0 6m9s [root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready master 17m v1.19.3 node01 Ready <none> 14m v1.19.3 node02 Ready <none> 14m v1.19.3 node03 Ready <none> 14m v1.19.3 [root@master ~]# kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE coredns-6d56c8448f-hxpjc 1/1 Running 0 17m coredns-6d56c8448f-lb5m4 1/1 Running 0 17m etcd-master 1/1 Running 0 17m kube-apiserver-master 1/1 Running 0 17m kube-controller-manager-master 1/1 Running 0 17m kube-proxy-46jqn 1/1 Running 0 12m kube-proxy-4bnmp 1/1 Running 0 12m kube-proxy-5lc7l 1/1 Running 0 12m kube-proxy-r8cll 1/1 Running 0 12m kube-scheduler-master 1/1 Running 0 17m
k8s命令补全
1 2 3 4 yum install -y bash-completion source /usr/share/bash-completion/bash_completionsource <(kubectl completion bash)kubectl completion bash > /etc/bash_completion.d/kubectl