K8S1.18 安装教程

第一 ,详细步骤

1, 虚拟机两台

(ip按自己的网络环境相应配置)(master/node)

vim /etc/hosts

机器IPhostname
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 # 永久关闭

 

4, 关闭swap

 (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+ 使用ipvscoredns无法解析域名采坑记

升级到 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



posted @ 2021-03-05 16:00  石门  阅读(1463)  评论(1编辑  收藏  举报