K8S1.18 安装教程
1, 虚拟机两台
(ip按自己的网络环境相应配置)(master/node)
vim /etc/hosts
机器IP | hostname |
---|---|
192.168.56.215 | k8s-master |
192.168.56.216 | k8s-node1 |
192.168.56.217 | k8s-node2 |
2, 关闭防火墙
(master/node)
systemctl stop firewalld
systemctl disable firewalld
3, 关闭selinux
(master/node)
setenforce 0 # 临时关闭
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 永久关闭
(master/node)
swapoff -a # 临时关闭;关闭swap主要是为了性能考虑
free # 可以通过这个命令查看swap是否关闭了
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久关闭
5, 添加主机名与IP对应的关系
(master/node)
$ vim /etc/hosts
#添加如下内容:
192.168.100.215 k8s-master
192.168.100.216 k8s-node1
#保存退出
6, 修改主机名(master/node)
k8s-master:
[root@localhost ~] hostname
localhost.localdomain
[root@localhost ~] hostname k8s-master ##临时生效
[root@localhost ~] hostnamectl set-hostname k8s-master ##重启后永久生效
k8s-node1:
[root@localhost ~] hostname
localhost.localdomain
[root@localhost ~] hostname k8s-node1 ##临时生效
[root@localhost ~] hostnamectl set-hostname k8s-node1 ##重启后永久生效
7,桥接设置
1, 网络参数
修改参数
#没有ipvs
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
#查询
sysctl --system
#启动 ipvs
cat >> /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
#配置生效
modprobe br_netfilter
modprobe nf_conntrack
modprobe nf_conntrack_ipv4
sysctl -p /etc/sysctl.d/k8s.conf
#检查
lsmod | grep nf_conntrack_ipv4
2,启动 ipvs
cat > /etc/sysconfig/modules/ipvs.modules << EOF
#!/bin/bash
ipvs_modules_dir="/usr/lib/modules/\$(uname -r)/kernel/net/netfilter/ipvs"
for kernel_module in \$(ls \$ipvs_modules_dir | sed -r 's@(.*).ko.xz@\1@'); do
/sbin/modinfo -F filename \$kernel_module &> /dev/null
echo $kernel_module >> /etc/modules-load.d/ipvs.conf
if [ \$? -eq 0 ]; then
/sbin/modprobe \$kernel_module
fi
done
EOF
注意:
启动IPVS服务 第2章节 详见
3.10-linux一下内核,使用k8s-1.18以上版本 启动IPVS可能会报错 错误处理 详见
虽然k8s所支持的ipvs模块不是太多,在这里我们选择全部加载
由于不同的内核版本的模块后缀不一样,所以我们要确认模块的后缀到底是什么,对于3.X版本的内核,该模块的后缀是 xx.ko.xz,而对于4.X版本的内核的后缀是 xx.ko
修改文件权限,并手动为当前系统加载内核模块:
chmod +x /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules
查看是否加载成功
lsmod | grep ip_vs
#检查
lsmod | grep nf_conntrack
p.s.
以上几步最好照着都执行一下,以免后面报一大堆错*
8, 安装docker
1 (master/node)
2
3 添加软件源
4 $yum install -y yum-utils device-mapper-persistent-data lvm2
5
6 $ yum -y install wget
7 # 添加docker yum源
8 $ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O/etc/yum.repos.d/docker-ce.repo
9 #查看可用版本
10 $yum list docker-ce --showduplicates
11 # 安装
12 $ yum -y install docker-ce-18.09.9-3.el7
13 # 设置开机启动
14 $ systemctl enable docker
15 # 启动docker
16 $ systemctl start docker
17 如果无法安装
18
19 或者
20 yum install -y --setopt=obsoletes=0 docker-ce-18.09.9-3.el7
21 #添加 --setopt=obsoletes=0
22 #是一个忽略废弃策略的参数
23 基本配置
24
25 修改配置信息
26
27 # vim /usr/lib/systemd/system/docker.service
28 ...
29 ExecStart=/usr/bin/dockerd --exec-opt native.cgroupdriver=systemd -H fd:// --containerd=/run/containerd/containerd.sock
30 ...
31 #添加
32 --exec-opt native.cgroupdriver=systemd
33 添加docker软件源
34
35 sudo mkdir -p /etc/docker
36 sudo tee /etc/docker/daemon.json <<-'EOF'
37 {
38 "registry-mirrors": ["https://******.mirror.aliyuncs.com"]
39 }
40 EOF
41 sudo systemctl daemon-reload
42 sudo systemctl restart docker
9,添加阿里云YUM软件源
1 cat > /etc/yum.repos.d/kubernetes.repo << EOF
2 [k8s]
3 name=k8s
4 enabled=1
5 gpgcheck=0
6 baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
7 EOF
10,安装kubeadm,kubelet和kubectl
1 #版本可以选择自己要安装的版本号,目前最新是1.19.2,我安装的是1.18.0
2 $ yum install -y kubelet-1.18.0 kubectl-1.18.0 kubeadm-1.18.0
3 # 此时,还不能启动kubelet,因为此时配置还不能,现在仅仅可以设置开机自启动
4 $ systemctl enable kubelet
5 kubelet配置
6
7 配置cgroup
8
9 # 获取 docker 的 cgroups
10
11 DOCKER_CGROUPS=$(docker info | grep 'Cgroup' | cut -d' ' -f3)
12
13 echo $DOCKER_CGROUPS
14
15 # 配置 kubelet 的 cgroups
16
17 cat > /etc/sysconfig/kubelet << EOF
18 KUBELET_EXTRA_ARGS="--cgroup-driver=$DOCKER_CGROUPS --fail-swap-on=false"
19 EOF
20
21 #手动
22 KUBELET_EXTRA_ARGS="--cgroup-driver=systemd --fail-swap-on=false"
23 "--cgroup-driver=systemd --fail-swap-on=false"
24 服务自启动
25
26 $systemctl enable kubelet
27 注意:
28
29 --cgroup-driver= 属性很重要,否则的话,集群初始化的时候,会发生如下报错:
30
31 Error while processing event ("/sys/fs/cgroup/devices/libcontainer_...): inoti
32
33 fy_add_watch /sys/fs/cgroup/devices/libcontainer_...: no such file or directory
34
35 因为新版的k8s不支持开启swap,所以要附加 --fail-swap-on=false 禁用swap
11,部署Kubernetes (master)
1 部署Kubernetes (master) 2 node节点不需要kubeadm init 3 4 kubeadm init 5 6 kubeadm init \ 7 --apiserver-advertise-address=10.0.8.10 \ 8 --image-repository registry.aliyuncs.com/google_containers \ 9 --kubernetes-version v1.18.0 \ 10 --service-cidr=10.1.0.0/16 \ 11 --pod-network-cidr=10.244.0.0/16 12 成功后末尾输出信息如下: 13 14 kubeadm join 10.0.8.10:6443 --token o07ylk.rsb5hbcingulujzy \ 15 --discovery-token-ca-cert-hash sha256:7b8ae247026495075b00ae2c0b64d2fa3760dbddba4872fc44f8c17f23dc2a78 16
p.s.这里是通过kubeadm init安装,所以执行后会下载相应的docker镜像,
一般会发现在控制台卡着不动很久,这时就是在下载镜像,你可以docker images查看是不是有新的镜像增加。 17 18 查看安装的镜像 19 20 $ docker images 21 REPOSITORY TAG IMAGE ID CREATED SIZE 22 registry.aliyuncs.com/google_containers/kube-proxy v1.17.0 7d54289267dc 7 months ago 116MB 23 registry.aliyuncs.com/google_containers/kube-apiserver v1.17.0 0cae8d5cc64c 7 months ago 171MB 24 registry.aliyuncs.com/google_containers/kube-controller-manager v1.17.0 5eb3b7486872 7 months ago 161MB 25 registry.aliyuncs.com/google_containers/kube-scheduler v1.17.0 78c190f736b1 7 months ago 94.4MB 26 registry.aliyuncs.com/google_containers/coredns 1.6.5 70f311871ae1 8 months ago 41.6MB 27 registry.aliyuncs.com/google_containers/etcd 3.4.3-0 303ce5db0e90 9 months ago 288MB 28 registry.aliyuncs.com/google_containers/pause 3.1 da86e6ba6ca1 2 years ago 742kB
12,使用kubectl工具
1 kubeadm安装好后,控制台也会有提示执行以下命令,照着执行 2 3 mkdir -p $HOME/.kube 4 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config 5 sudo chown $(id -u):$(id -g) $HOME/.kube/config 6 测试一下kubectl命令 7 8 [root@k8s-master ~]# kubectl get nodes 9 NAME STATUS ROLES AGE VERSION 10 k8s-master NotReady master 23m v1.18.0
13,安装Pod网络插件
1 kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
2 报错:The connection to the server raw.githubusercontent.com was refused - did you specify the right host or port? 3 4 原因:外网不可访问 解决办法: 5 6 sudo vim /etc/hosts 7 #在/etc/hosts增加以下这条 8 199.232.28.133 raw.githubusercontent.com 9 10 重新执行上面命令,便可成功安装!
14, node节点加入master
1 node
2 kubeadm join 10.0.8.10:6443 --token o07ylk.rsb5hbcingulujzy \
3 --discovery-token-ca-cert-hash sha256:7b8ae247026495075b00ae2c0b64d2fa3760dbddba4872fc44f8c17f23dc2a78
4
5 在master查看
6
7 kubectl get nodes
8 NAME STATUS ROLES AGE VERSION
9 k8s-master Ready master 22m v1.18.0
10 k8s-node1 Ready <none> 18m v1.18.0
11 注意
12 安装时注意自己安装的程序版本
13
14 k8s组件也是以docker容器的形式存在,所以会下载很多dokcer image
15
16 一般安装不会在胜利,会出现不少问题,用tailf /var/log/messages跟踪下日志
17
18 最好把几台机器系统时间同步下,节点通讯中的token与时间也有关
第二,其他环境
1, 开启ipvs
1 检查配置信息
2
3 $ kubectl get cm -n kube-system
4 .....
5 NAME DATA AGE
6 coredns 1 10h
7 extension-apiserver-authentication 6 10h
8 kube-flannel-cfg 2 10h
9 kube-proxy 2 10h
10 kubeadm-config 2 10h
11 kubelet-config-1.18 1 10h
12 .....
13 修改配置信息
14
15 $ kubectl edit configmap kube-proxy -n kube-system
16 ...
17 mode: "ipvs"
18 ...
19 获取所有kube-proxy
20
21 $ kubectl get pods -n kube-system | proxy
22
23 kube-proxy-dqwcm 1/1 Running 4 97m
24 kube-proxy-lfhzt 1/1 Running 4 98m
25 kube-proxy-v28m7 1/1 Running 4 97m
26
27 重启所有proxy
28
29 手动
30 $ kubectl delete pods kube-proxy-dqwcm -n kube-system
31
32 自动
33 重启所有proxy
34 proxy_list=$(kubectl get pod -n kube-system | grep kube-proxy | awk '{print $1}')
35 for pod in $proxy_list
36 do
37 kubectl delete pod $pod -n kube-system
38 done
39
40 查看日志 是否成功
41
42 $ kubectl logs kube-proxy-dqwcm -n -system
43
2, 测试环境
1 启动NGINX
2
3 #启动Nginx
4 kubectl run nginx --image=nginx
5 #创建 deployment 调度器
6 kubectl crate deployment nginx --image=nginx
7 #映射端口
8 kubectl expose deployment nginx --port=80 --type=NodePort
9 #查看
10 kubectl get all
11
12 查看你的端口号: 假设9000
13
14 浏览器打开
15 http//192.168.56.101:9000
故障排查
1 K8S在kubeadm init后,没有记录kubeadm join如何查询?
2
3 #再生成一个token即可
4 kubeadm token create --print-join-command
5 #下在的命令可以查看历史的token
6 kubeadm token list
7 node节点kubeadm join失败后,要重新join怎么办?
8
9 #先执行
10 kubeadm -y reset
11 #再执行
12 kubeadm join xx.....
13 重启kubelet
14
15 systemctl daemon-reload
16 systemctl restart kubelet
17 查询
18
19 #查询节点
20 kubectl get nodes
21 #查询pods 一般要带上"-n"即命名空间。不带等同 -n dafault
22 kubectl get pods -n kube-system
-
故障排查
一、故障产生
在不关闭kubernets相关服务的情况下,对kubernets的master节点进行重启。(模拟服务器的异常掉电)
二、故障状况
启动后无法远程到kubernets的dashbaord,后进行如下命令报错。
1 # kubectl get nodes
2 The connection to the server <master>:6443 was refused - did you specify the right host or port?
ipvs 报错
kubernetes 1.18+ 使用ipvs后coredns无法解析域名采坑记
升级到 kubernetes 1.18 版本出现 IPVS 报错,所以去 Kubernetes Github 查看相关 issues,发现有人在升级
Kubernetes 版本到 1.18 后,也遇见了相同的问题,经过 issue 中 Kubernetes 维护人员讨论,分析出原因可能为新版
Kubernetes 使用的 IPVS 模块是比较新的,需要系统内核版本支持,本人使用的是 CentOS 系统,内核版本为 3.10,里面的
IPVS 模块比较老旧,缺少新版 Kubernetes IPVS 所需的依赖。
根据该 issue 讨论结果,解决该问题的办法是,更新内核为新的版本。
> 注:该 issues 地址为 https://github.com/kubernetes/kubernetes/issues/89520
解决问题
-
参考 http://team.jiunile.com/blog/2020/05/k8s-1-18-ipvs-problem.html
升级系统内核版本
升级 Kubernetes 集群各个节点的 CentOS 系统内核版本:
# 载入公钥
$ rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# 安装 ELRepo 最新版本
$ yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
# 列出可以使用的 kernel 包版本
$ yum list available --disablerepo=* --enablerepo=elrepo-kernel
# 安装指定的 kernel 版本:
$ yum install -y kernel-lt-5.4.102-1.el7.elrepo --enablerepo=elrepo-kernel
# 查看系统可用内核
$ cat /boot/grub2/grub.cfg | grep menuentry
menuentry 'CentOS Linux (3.10.0-1062.el7.x86_64) 7 (Core)' --class centos (略)
menuentry 'CentOS Linux (5.4.102-1.el7.elrepo.x86_64) 7 (Core)' --class centos ...(略)
# 设置开机从新内核启动
$ grub2-set-default "CentOS Linux (5.4.102-1.el7.elrepo.x86_64) 7 (Core)"
# 查看内核启动项
$ grub2-editenv list
saved_entry=CentOS Linux (5.4.102-1.el7.elrepo.x86_64) 7 (Core)重启系统使内核生效,启动完成查看内核版本是否更新:
$ uname -r
5.4.102-1.el7.elrepo.x86_64查看是否解决
$ kubectl logs kube-proxy-dqwcm -n kube-system
[root@k8s-master ~]# kubectl logs kube-proxy-dqwcm -n kube-system
I0304 14:05:38.818316 1 node.go:136] Successfully retrieved node IP: 10.0.8.10
I0304 14:05:38.820216 1 server_others.go:259] Using ipvs Proxier.
W0304 14:05:38.820500 1 proxier.go:429] IPVS scheduler not specified, use rr by default
I0304 14:05:38.820685 1 server.go:583] Version: v1.18.0
I0304 14:05:38.820998 1 conntrack.go:52] Setting nf_conntrack_max to 131072
I0304 14:05:38.821793 1 config.go:315] Starting service config controller
I0304 14:05:38.821802 1 shared_informer.go:223] Waiting for caches to sync for service config
I0304 14:05:38.821812 1 config.go:133] Starting endpoints config controller
I0304 14:05:38.821820 1 shared_informer.go:223] Waiting for caches to sync for endpoints config
I0304 14:05:38.922200 1 shared_informer.go:230] Caches are synced for service config
I0304 14:05:38.924720 1 shared_informer.go:230] Caches are synced for endpoints config
故障处理:
1.检查环境变量情况(正常)
env | grep -i kub
2.检查docker服务(正常)
systemctl status docker.service
3.检查kubelet服务(表面正常)
systemctl status kubelet.service
4.查看端口是是否被监听(没有监听)
netstat -pnlt | grep 6443
5.检查防火墙状态(正常)
systemctl status firewalld.service
6.查看日志
journalctl -xeu kubelet
这里分析,应该是镜像的问题。
6.1 重新导入一下API镜像即可。
docker load -i kube-apiserver-amd64_v1.9.0.tar
6.2 重启docker和kubelet服务
# systemctl restart docker.service
# systemctl restart kubelet.service
6.3 检查服务(此时正常)
kubectl get nodes
至此,故障处理完成。
解决方法1: export KUBECONFIG=/etc/kubernetes/admin.conf export $HOME/.kube/config
解决方法2: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf HOME/.kube/config sudo chown (id -u):$(id -g) $HOME/.kube/config Alternatively you can also export KUBECONFIG variable like this: export KUBECONFIG=$HOME/.kube/config
解决方法3: #!/bin/bash swapoff -a systemctl start kubelet docker start (docker ps -a -q) docker start (docker ps -a -q)
解决方法4: sudo systemctl status firewalld #redhat centos sudo systemctl stop firewalld #redhat, centos sudo ufw status verbose #ubuntu sudo ufw disable #ubuntu
解决方法5: master: 192.168.211.40 node1: 192.168.211.41 node2: 192.168.211.42 master
———————————————— 版权声明:
本文为CSDN博主「翟雨佳blogs」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yujia_666/article/details/114118291