centos7离线部署K8S(非高可用版)


 

centos7离线部署K8S(非高可用版)

云原生

 

 

 

一.前期准备包和镜像1.21版本

 

1.1离线部署docker

参考网址:
https://www.zybuluo.com/mayongjie1/note/1912326

 

1.2准备包

准备的包有:

 

  1. 10-kubeadm.conf kubeadm kubectl kubelet kubelet.service kubeadm.yaml

通过scp或者U盘上传

 

  1. cd /usr/bin
  2. 165 scp kube* @172.20.10.2:/root/ma
  3. 166 cd /usr/lib/systemd/system/kubelet.service.d
  4. 169 scp 10-kubeadm.conf @172.20.10.2:/root/ma
  5. 170 cd /usr/lib/systemd/system
  6. 173 scp kubelet.service @172.20.10.2:/root/ma

 

1.3准备镜像

 

  1. docker load < image.tar
  2. docke images

 

二.部署K8S

 

安装前准备工作

 

1. 设置hosts解析

操作节点:所有节点(k8s-master,k8s-slave)均需执行

  • 修改hostname
    hostname必须只能包含小写字母、数字、”,”、”-“,且开头结尾必须是小写字母或数字

 

  1. # 在master节点
  2. $ hostnamectl set-hostname k8s-master #设置master节点的hostname
  3. # 在slave-1节点
  4. $ hostnamectl set-hostname k8s-slave1 #设置slave1节点的hostname
  5. # 在slave-2节点
  6. $ hostnamectl set-hostname k8s-slave2 #设置slave2节点的hostname
  • 添加hosts解析

 

  1. $ cat >>/etc/hosts<<EOF
  2. 172.21.32.15 k8s-master
  3. 172.21.32.11 k8s-slave1
  4. 172.21.32.9 k8s-slave2
  5. EOF

 

2. 调整系统配置

操作节点: 所有的master和slave节点(k8s-master,k8s-slave)需要执行

本章下述操作均以k8s-master为例,其他节点均是相同的操作(ip和hostname的值换成对应机器的真实值)

  • 设置安全组开放端口

如果节点间无安全组限制(内网机器间可以任意访问),可以忽略,否则,至少保证如下端口可通:
k8s-master节点:TCP:6443,2379,2380,60080,60081UDP协议端口全部打开
k8s-slave节点:UDP协议端口全部打开

  • 设置iptables

 

  1. iptables -P FORWARD ACCEPT
  • 关闭swap

 

  1. swapoff -a
  2. # 防止开机自动挂载 swap 分区
  3. sed -i '/ swap / s/^/(.*/)$/#/1/g' /etc/fstab
  • 关闭selinux和防火墙

 

  1. sed -ri 's#(SELINUX=).*#/1disabled#' /etc/selinux/config
  2. setenforce 0
  3. systemctl disable firewalld && systemctl stop firewalld
  • 修改内核参数
  • 修改内核网络参数,增加iptables相关配置,命令如下

 

  1. cat <<EOF > /etc/sysctl.d/k8s.conf
  2. net.bridge.bridge-nf-call-ip6tables = 1
  3. net.bridge.bridge-nf-call-iptables = 1
  4. net.ipv4.ip_forward=1
  5. vm.max_map_count=262144
  6. EOF
  7. modprobe br_netfilter
  8. sysctl -p /etc/sysctl.d/k8s.conf
  • 有网时间同步

 

  1. yum -y install yum-utils device-mapper-persistent-data lvm2 socat conntrack-tools ntpdate bind-utils chrony
  2. 2、手动同步时间,执行以下命令,将从ntp1.aliyun.com同步时间
  3. # ntpdate ntp1.aliyun.com
  4. 3、设置定时计划任务
  5. # echo " */3 * * * * /usr/sbin/ntpdate -u ntp1.aliyun.com > /dev/null 2>&1 " >> /var/spool/cron/root
  6. 4、使用date命令查看当前时间
  7. # date
  8. 5、系统时间同步到硬件,防止系统重启后时间被还原
  9. # hwclock --systohc
  • 无网时间同步
说明:
  1. 如果每个服务器都可以有公网IP地址与外界通信,那简单的方式就是:每个服务器都可以配置与互联网上的时间服务器进行同步,达到每个内外网服务器系统时间的一致性。

  2. 但是通常的情况是:在IDC托管的服务器只有前端WEB服务器对外通信,数据库,文件等服务器只是通过私网地址与前端WEB通信,形成整体的架构。微博易的系统正是这种情况。
    这个时候就需要整体系统内部有一台服务器来担当中介,具体是:将某台服务器配置成时间服务器(注:此服务器能直接同步互联网上的时间服务器),其他所有服务器都定时与这台服务器在内部进行时间同步,达到每个服务器的时间一致性。
    方案图示
    图片.png-148.9kB

 

  1. 时钟同步
  2. 凡是机群类应用都要求机群的一致性,那么对于时间也是如此,需要保持集群中的所有节点时间一致。这里使用chrony这个程序来完成。
  3. 在节点中安装chrony软件包
  4. #上面安装docker_install的时候已经安装好了,所以这里不用额外安装
  5. #sudo apt-get install chrony

 

  1. #在master节点上配置
  2. #修改chrony配置文件/etc/chrony.conf,添加如下内容
  3. vim /etc/chrony.conf
  4. pool ntp.ntsc.ac.cn iburst
  5. allow 192.168.26.0/24 ##已实际所在的网端为准
  6. local stratum 10 ##当授时服务器不可用的时候已本地时间位置
  7. #删除多余的pool配置,只保留上述内容中的,国家授时中心配置,然后增加allow允许192.168.26.0/24这个网段的机器进行同步该主机时间。

master前后更改对比
图片.png-113.6kB
图片.png-67.7kB

 

  1. #node节点上操作
  2. #而node节点中配置修改如下,同步服务器配置成master节点地址,让所有node节点同步master时间。
  3. vim /etc/chrony.conf
  4. pool 192.168.26.10 iburst

ndoe节点前后对比

图片.png-498.4kB
图片.png-489.5kB

 

  1. #各个节点上都执行一下
  2. 执行以下命令查看时间与时区配置,需要将时区更改为"Asia/Shanghai",在中国使用时区配置。
  3. sudo timedatectl
  4. 设置时区
  5. sudo timedatectl set-timezone "Asia/Shanghai"
  6. 重启chronyd服务
  7. sudo systemctl restart chronyd
  8. 输入以下命令检查
  9. sudo timedatectl
  10. 在输出中检查“System clock synchronized”是否为yes,yes表示时钟同步正常。

 

2.1部署master

 

  1. mkdir -p /usr/lib/systemd/system/kubelet.service.d
  2. chmod +x {kubeadm,kubelet,kubectl}
  3. mv kubeadm kubelet kubectl /usr/bin/
  4. mv 10-kubeadm.conf /usr/lib/systemd/system/kubelet.service.d/
  5. mv kubelet.service /usr/lib/systemd/system/
  6. systemctl enable --now kubelet

 

2.2部署node

以下命令在master节点中操作,通过scp将文件复制到node节点中,(请将 《node host》替换为实际IP地址)

 

  1. 以下命令在master节点中操作,通过scp将文件复制到node节点中,(请将<node host>替换为实际IP地址)
  2. scp kubelet kubeadm <node host>:/usr/bin/
  3. scp /usr/bin/{kubelet,kubeadm} @172.20.10.4:/usr/bin/
  4. scp /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf @172.20.10.4:/usr/lib/systemd/system/kubelet.service.d/
  5. scp /usr/lib/systemd/system/kubelet.service 172.20.10.4:/usr/lib/systemd/system/

 

2.3初始化master

操作节点:只在master节点(k8s-master)执行

 

  1. kubeadm init --config kubeadm.yaml

接下来按照上述提示信息操作,配置kubectl客户端的认证

 

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

 

  1. $ cat kubeadm.yaml
  2. apiVersion: kubeadm.k8s.io/v1beta2
  3. bootstrapTokens:
  4. - groups:
  5. - system:bootstrappers:kubeadm:default-node-token
  6. token: abcdef.0123456789abcdef
  7. ttl: 24h0m0s
  8. usages:
  9. - signing
  10. - authentication
  11. kind: InitConfiguration
  12. localAPIEndpoint:
  13. advertiseAddress: 172.21.32.15 # apiserver地址,因为单master,所以配置master的节点内网IP
  14. bindPort: 6443
  15. nodeRegistration:
  16. criSocket: /var/run/dockershim.sock
  17. name: k8s-master
  18. taints:
  19. - effect: NoSchedule
  20. key: node-role.kubernetes.io/master
  21. ---
  22. apiServer:
  23. timeoutForControlPlane: 4m0s
  24. apiVersion: kubeadm.k8s.io/v1beta2
  25. certificatesDir: /etc/kubernetes/pki
  26. clusterName: kubernetes
  27. controllerManager: {}
  28. dns:
  29. type: CoreDNS
  30. etcd:
  31. local:
  32. dataDir: /var/lib/etcd
  33. imageRepository: registry.aliyuncs.com/google_containers # 修改成阿里镜像源
  34. kind: ClusterConfiguration
  35. kubernetesVersion: v1.16.2
  36. networking:
  37. dnsDomain: cluster.local
  38. podSubnet: 172.16.0.0/16 # Pod 网段,flannel插件需要使用这个网段
  39. serviceSubnet: 10.96.0.0/12
  40. scheduler: {}

而下面这句,这是告诉你将node节点加入集群时,需要使用的指令

 

  1. sudo kubeadm join 192.168.26.10:6443 --token ute3a9.0v4blwj4ixpajdqq /
  2. --discovery-token-ca-cert-hash sha256:de293279b9b8587f11a0d634dc22ffbabc2396092ea45841dfbeea0c78cfb024

该指令中包含的认证token,你需要将此内容记录下来。而当你忘记了,也可以通过以下命令重新创建一个。命令如下

 

  1. sudo kubeadm token create --print-join-command

报错请参考:
https://blog.csdn.net/ichen820/article/details/119851189

或者是在master节点中操作kubeadm来初始化master节点,命令如下
但是没有实测过,

 

  1. kubeadm init --node-name=k8s-master /
  2. --kubernetes-version=1.19.2/
  3. --apiserver-advertise-address=$MASTER_HOST_IP /
  4. --service-cidr=10.96.0.0/16 /
  5. --pod-network-cidr=172.16.0.0/16

 

2.4安装calico网络插件

  • 提前准备calico_images.tar和calico.yaml
  • calico默认是用172.16的网段,也可在配置文件里改

 

  1. docker save calico/node:v3.20.5 calico/pod2daemon-flexvol:v3.20.5 calico/cni:v3.20.5 calico/kube-controllers:v3.20.5 > 1calico_images.tar
  2. #这里有.tar包就用curl
  3. #curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O
  4. #master和node上都要导入包
  5. docker load -i 1calico_images.tar
  6. #ctr -n k8s.io i import calico_images.tar
  7. #只在master上执行
  8. kubectl apply -f calico.yaml
  9. kubectl -n kube-system get po -o wide
  10. kubectl -n kube-system get svc
  11. 重启网络插件
  12. [root@k8s-master ~]# kubectl -n kube-system delete po/calico-kube-controllers-6d9cdcd744-698vd
  13. pod "calico-kube-controllers-6d9cdcd744-698vd" deleted
  14. [root@k8s-master ~]# kubectl -n kube-system delete po/coredns-6d56c8448f-c5n77
  15. pod "coredns-6d56c8448f-c5n77" deleted
  16. [root@k8s-master ~]# kubectl -n kube-system delete po/coredns-6d56c8448f-xtzkj
  17. pod "coredns-6d56c8448f-xtzkj" deleted
  18. [root@k8s-master ~]# kubectl -n kube-system get po -o wide

 

  • 安装calico前后解析busybox后nslookup

     

    未安装calico解析不到

 

  1. [root@k8s-master ~]# kubectl get svc
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9d
  4. [root@k8s-master ~]# nslookup kubernetes
  5. Server: 172.20.10.1
  6. Address: 172.20.10.1#53
  7. ** server can't find kubernetes: NXDOMAIN

安装calico后可以解析到

 

  1. [root@k8s-master ma]# kubectl run busybox -it --rm --image=busybox:1.28.3
  2. If you don't see a command prompt, try pressing enter.
  3. / # nslookup kubernetes
  4. Server: 10.96.0.10
  5. Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
  6. Name: kubernetes
  7. Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
  8. / #

重启前后ip地址发生变化
重启前
图片.png-121.5kB
重启后
图片.png-119.7kB

 

2.5kubectl自动补全

为了更方便的使用kubectl工具,可以为kubectl配置命令自动补全,这样当有些参数记不清时,就可以使用tap键来触发自动补全参数。
要使用自动补全需要在宿主机中安装一个软件包bash-completion,在master节点操作

 

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

 


2022-06-17 23:21
字数 7082
阅读 13

 
 
 

原创文章,作者:,如若转载,请注明出处:https://blog.ytso.com/268282.html

(0)
上一篇 2022年6月19日
下一篇 2022年6月19日

相关推荐

发表回复

登录后才能评论