centos7离线部署K8S(非高可用版)
centos7离线部署K8S(非高可用版)
云原生
一.前期准备包和镜像1.21版本
1.1离线部署docker
参考网址:
https://www.zybuluo.com/mayongjie1/note/1912326
1.2准备包
准备的包有:
10-kubeadm.conf kubeadm kubectl kubelet kubelet.service kubeadm.yaml
通过scp或者U盘上传
cd /usr/bin165 scp kube* @172.20.10.2:/root/ma166 cd /usr/lib/systemd/system/kubelet.service.d169 scp 10-kubeadm.conf @172.20.10.2:/root/ma170 cd /usr/lib/systemd/system173 scp kubelet.service @172.20.10.2:/root/ma
1.3准备镜像
docker load < image.tardocke images
二.部署K8S
安装前准备工作
1. 设置hosts解析
操作节点:所有节点(k8s-master,k8s-slave)均需执行
- 修改hostname
hostname必须只能包含小写字母、数字、","、"-",且开头结尾必须是小写字母或数字
# 在master节点$ hostnamectl set-hostname k8s-master #设置master节点的hostname# 在slave-1节点$ hostnamectl set-hostname k8s-slave1 #设置slave1节点的hostname# 在slave-2节点$ hostnamectl set-hostname k8s-slave2 #设置slave2节点的hostname
- 添加hosts解析
$ cat >>/etc/hosts<<EOF172.21.32.15 k8s-master172.21.32.11 k8s-slave1172.21.32.9 k8s-slave2EOF
2. 调整系统配置
操作节点: 所有的master和slave节点(k8s-master,k8s-slave)需要执行
本章下述操作均以k8s-master为例,其他节点均是相同的操作(ip和hostname的值换成对应机器的真实值)
- 设置安全组开放端口
如果节点间无安全组限制(内网机器间可以任意访问),可以忽略,否则,至少保证如下端口可通:
k8s-master节点:TCP:6443,2379,2380,60080,60081UDP协议端口全部打开
k8s-slave节点:UDP协议端口全部打开
- 设置iptables
iptables -P FORWARD ACCEPT
- 关闭swap
swapoff -a# 防止开机自动挂载 swap 分区sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
- 关闭selinux和防火墙
sed -ri 's#(SELINUX=).*#\1disabled#' /etc/selinux/configsetenforce 0systemctl disable firewalld && systemctl stop firewalld
- 修改内核参数
- 修改内核网络参数,增加iptables相关配置,命令如下
cat <<EOF > /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward=1vm.max_map_count=262144EOFmodprobe br_netfiltersysctl -p /etc/sysctl.d/k8s.conf
- 有网时间同步
yum -y install yum-utils device-mapper-persistent-data lvm2 socat conntrack-tools ntpdate bind-utils chrony2、手动同步时间,执行以下命令,将从ntp1.aliyun.com同步时间# ntpdate ntp1.aliyun.com3、设置定时计划任务# echo " */3 * * * * /usr/sbin/ntpdate -u ntp1.aliyun.com > /dev/null 2>&1 " >> /var/spool/cron/root4、使用date命令查看当前时间# date5、系统时间同步到硬件,防止系统重启后时间被还原# hwclock --systohc
- 无网时间同步
- 说明:
-
如果每个服务器都可以有公网IP地址与外界通信,那简单的方式就是:每个服务器都可以配置与互联网上的时间服务器进行同步,达到每个内外网服务器系统时间的一致性。
-
但是通常的情况是:在IDC托管的服务器只有前端WEB服务器对外通信,数据库,文件等服务器只是通过私网地址与前端WEB通信,形成整体的架构。微博易的系统正是这种情况。
这个时候就需要整体系统内部有一台服务器来担当中介,具体是:将某台服务器配置成时间服务器(注:此服务器能直接同步互联网上的时间服务器),其他所有服务器都定时与这台服务器在内部进行时间同步,达到每个服务器的时间一致性。
方案图示
![图片.png-148.9kB]()
时钟同步凡是机群类应用都要求机群的一致性,那么对于时间也是如此,需要保持集群中的所有节点时间一致。这里使用chrony这个程序来完成。在节点中安装chrony软件包#上面安装docker_install的时候已经安装好了,所以这里不用额外安装#sudo apt-get install chrony
#在master节点上配置#修改chrony配置文件/etc/chrony.conf,添加如下内容vim /etc/chrony.confpool ntp.ntsc.ac.cn iburstallow 192.168.26.0/24 ##已实际所在的网端为准local stratum 10 ##当授时服务器不可用的时候已本地时间位置#删除多余的pool配置,只保留上述内容中的,国家授时中心配置,然后增加allow允许192.168.26.0/24这个网段的机器进行同步该主机时间。
master前后更改对比

#node节点上操作#而node节点中配置修改如下,同步服务器配置成master节点地址,让所有node节点同步master时间。vim /etc/chrony.confpool 192.168.26.10 iburst
ndoe节点前后对比

#各个节点上都执行一下执行以下命令查看时间与时区配置,需要将时区更改为"Asia/Shanghai",在中国使用时区配置。sudo timedatectl设置时区sudo timedatectl set-timezone "Asia/Shanghai"重启chronyd服务sudo systemctl restart chronyd输入以下命令检查sudo timedatectl在输出中检查“System clock synchronized”是否为yes,yes表示时钟同步正常。
2.1部署master
mv /usr/bin/kubelet /tmp
mkdir -p /usr/lib/systemd/system/kubelet.service.dchmod +x {kubeadm,kubelet,kubectl}mv kubeadm kubelet kubectl /usr/bin/mv 10-kubeadm.conf /usr/lib/systemd/system/kubelet.service.d/mv kubelet.service /usr/lib/systemd/system/systemctl enable --now kubelet
2.2部署node
以下命令在master节点中操作,通过scp将文件复制到node节点中,(请将 《node host》替换为实际IP地址)
以下命令在master节点中操作,通过scp将文件复制到node节点中,(请将<node host>替换为实际IP地址)scp kubelet kubeadm <node host>:/usr/bin/scp /usr/bin/{kubelet,kubeadm} @172.20.10.4:/usr/bin/scp /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf @172.20.10.4:/usr/lib/systemd/system/kubelet.service.d/scp /usr/lib/systemd/system/kubelet.service 172.20.10.4:/usr/lib/systemd/system/
2.3初始化master
操作节点:只在master节点(k8s-master)执行
kubeadm init --config kubeadm.yaml
接下来按照上述提示信息操作,配置kubectl客户端的认证
mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
$ cat kubeadm.yamlapiVersion: kubeadm.k8s.io/v1beta2bootstrapTokens:- groups:- system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authenticationkind: InitConfigurationlocalAPIEndpoint:advertiseAddress: 172.21.32.15 # apiserver地址,因为单master,所以配置master的节点内网IPbindPort: 6443nodeRegistration:criSocket: /var/run/dockershim.sockname: k8s-mastertaints:- effect: NoSchedulekey: node-role.kubernetes.io/master---apiServer:timeoutForControlPlane: 4m0sapiVersion: kubeadm.k8s.io/v1beta2certificatesDir: /etc/kubernetes/pkiclusterName: kubernetescontrollerManager: {}dns:type: CoreDNSetcd:local:dataDir: /var/lib/etcdimageRepository: registry.aliyuncs.com/google_containers # 修改成阿里镜像源kind: ClusterConfigurationkubernetesVersion: v1.16.2networking:dnsDomain: cluster.localpodSubnet: 172.16.0.0/16 # Pod 网段,flannel插件需要使用这个网段serviceSubnet: 10.96.0.0/12scheduler: {}
而下面这句,这是告诉你将node节点加入集群时,需要使用的指令
sudo kubeadm join 192.168.26.10:6443 --token ute3a9.0v4blwj4ixpajdqq \--discovery-token-ca-cert-hash sha256:de293279b9b8587f11a0d634dc22ffbabc2396092ea45841dfbeea0c78cfb024
该指令中包含的认证token,你需要将此内容记录下来。而当你忘记了,也可以通过以下命令重新创建一个。命令如下
sudo kubeadm token create --print-join-command
报错请参考:
https://blog.csdn.net/ichen820/article/details/119851189
或者是在master节点中操作kubeadm来初始化master节点,命令如下
但是没有实测过,
kubeadm init --node-name=k8s-master \
--kubernetes-version=1.21.2\
--apiserver-advertise-address=$MASTER_HOST_IP \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16\
--image-repository=registry.aliyuncs.com/google_containerskubeadm init --node-name=k8s-master \--kubernetes-version=1.19.2\--apiserver-advertise-address=$MASTER_HOST_IP \--service-cidr=10.96.0.0/16 \--pod-network-cidr=172.16.0.0/16
2.4安装calico网络插件
- 提前准备calico_images.tar和calico.yaml
- calico默认是用172.16的网段,也可在配置文件里改
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#这里有.tar包就用curl#curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O#master和node上都要导入包docker load -i 1calico_images.tar#ctr -n k8s.io i import calico_images.tar#只在master上执行kubectl apply -f calico.yamlkubectl -n kube-system get po -o widekubectl -n kube-system get svc重启网络插件[root@k8s-master ~]# kubectl -n kube-system delete po/calico-kube-controllers-6d9cdcd744-698vdpod "calico-kube-controllers-6d9cdcd744-698vd" deleted[root@k8s-master ~]# kubectl -n kube-system delete po/coredns-6d56c8448f-c5n77pod "coredns-6d56c8448f-c5n77" deleted[root@k8s-master ~]# kubectl -n kube-system delete po/coredns-6d56c8448f-xtzkjpod "coredns-6d56c8448f-xtzkj" deleted[root@k8s-master ~]# kubectl -n kube-system get po -o wide
- 安装calico前后解析busybox后nslookup
未安装calico解析不到
[root@k8s-master ~]# kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9d[root@k8s-master ~]# nslookup kubernetesServer: 172.20.10.1Address: 172.20.10.1#53** server can't find kubernetes: NXDOMAIN
安装calico后可以解析到
[root@k8s-master ma]# kubectl run busybox -it --rm --image=busybox:1.28.3If you don't see a command prompt, try pressing enter./ # nslookup kubernetesServer: 10.96.0.10Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.localName: kubernetesAddress 1: 10.96.0.1 kubernetes.default.svc.cluster.local/ #
重启前后ip地址发生变化
重启前
重启后

2.5kubectl自动补全
为了更方便的使用kubectl工具,可以为kubectl配置命令自动补全,这样当有些参数记不清时,就可以使用tap键来触发自动补全参数。
要使用自动补全需要在宿主机中安装一个软件包bash-completion,在master节点操作
yum install -y bash-completionsource /usr/share/bash-completion/bash_completionsource <(kubectl completion bash)echo "source <(kubectl completion bash)" >> ~/.bashrc-
cat >> ~/.bashrc << EOF alias kg='kubectl get' alias k='kubectl' alias kd='kubectl describe pods' alias ke='kubectl explain' alias ka='kubectl apply' EOF这里是我配置的别名
source ~/.bashrc 执行下就够了
@mayongjie1
2022-06-17 23:21
字数 7082
阅读 13


浙公网安备 33010602011771号