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/bin
165 scp kube* @172.20.10.2:/root/ma
166 cd /usr/lib/systemd/system/kubelet.service.d
169 scp 10-kubeadm.conf @172.20.10.2:/root/ma
170 cd /usr/lib/systemd/system
173 scp kubelet.service @172.20.10.2:/root/ma
1.3准备镜像
docker load < image.tar
docke 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<<EOF
172.21.32.15 k8s-master
172.21.32.11 k8s-slave1
172.21.32.9 k8s-slave2
EOF
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/config
setenforce 0
systemctl disable firewalld && systemctl stop firewalld
- 修改内核参数
- 修改内核网络参数,增加iptables相关配置,命令如下
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
vm.max_map_count=262144
EOF
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
- 有网时间同步
yum -y install yum-utils device-mapper-persistent-data lvm2 socat conntrack-tools ntpdate bind-utils chrony
2、手动同步时间,执行以下命令,将从ntp1.aliyun.com同步时间
# ntpdate ntp1.aliyun.com
3、设置定时计划任务
# echo " */3 * * * * /usr/sbin/ntpdate -u ntp1.aliyun.com > /dev/null 2>&1 " >> /var/spool/cron/root
4、使用date命令查看当前时间
# date
5、系统时间同步到硬件,防止系统重启后时间被还原
# hwclock --systohc
- 无网时间同步
- 说明:
-
如果每个服务器都可以有公网IP地址与外界通信,那简单的方式就是:每个服务器都可以配置与互联网上的时间服务器进行同步,达到每个内外网服务器系统时间的一致性。
-
但是通常的情况是:在IDC托管的服务器只有前端WEB服务器对外通信,数据库,文件等服务器只是通过私网地址与前端WEB通信,形成整体的架构。微博易的系统正是这种情况。
这个时候就需要整体系统内部有一台服务器来担当中介,具体是:将某台服务器配置成时间服务器(注:此服务器能直接同步互联网上的时间服务器),其他所有服务器都定时与这台服务器在内部进行时间同步,达到每个服务器的时间一致性。
方案图示
时钟同步
凡是机群类应用都要求机群的一致性,那么对于时间也是如此,需要保持集群中的所有节点时间一致。这里使用chrony这个程序来完成。
在节点中安装chrony软件包
#上面安装docker_install的时候已经安装好了,所以这里不用额外安装
#sudo apt-get install chrony
#在master节点上配置
#修改chrony配置文件/etc/chrony.conf,添加如下内容
vim /etc/chrony.conf
pool ntp.ntsc.ac.cn iburst
allow 192.168.26.0/24 ##已实际所在的网端为准
local stratum 10 ##当授时服务器不可用的时候已本地时间位置
#删除多余的pool配置,只保留上述内容中的,国家授时中心配置,然后增加allow允许192.168.26.0/24这个网段的机器进行同步该主机时间。
master前后更改对比
#node节点上操作
#而node节点中配置修改如下,同步服务器配置成master节点地址,让所有node节点同步master时间。
vim /etc/chrony.conf
pool 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
mkdir -p /usr/lib/systemd/system/kubelet.service.d
chmod +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/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
$ cat kubeadm.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 172.21.32.15 # apiserver地址,因为单master,所以配置master的节点内网IP
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: k8s-master
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers # 修改成阿里镜像源
kind: ClusterConfiguration
kubernetesVersion: v1.16.2
networking:
dnsDomain: cluster.local
podSubnet: 172.16.0.0/16 # Pod 网段,flannel插件需要使用这个网段
serviceSubnet: 10.96.0.0/12
scheduler: {}
而下面这句,这是告诉你将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.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.yaml
kubectl -n kube-system get po -o wide
kubectl -n kube-system get svc
重启网络插件
[root@k8s-master ~]# kubectl -n kube-system delete po/calico-kube-controllers-6d9cdcd744-698vd
pod "calico-kube-controllers-6d9cdcd744-698vd" deleted
[root@k8s-master ~]# kubectl -n kube-system delete po/coredns-6d56c8448f-c5n77
pod "coredns-6d56c8448f-c5n77" deleted
[root@k8s-master ~]# kubectl -n kube-system delete po/coredns-6d56c8448f-xtzkj
pod "coredns-6d56c8448f-xtzkj" deleted
[root@k8s-master ~]# kubectl -n kube-system get po -o wide
- 安装calico前后解析busybox后nslookup
未安装calico解析不到
[root@k8s-master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9d
[root@k8s-master ~]# nslookup kubernetes
Server: 172.20.10.1
Address: 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.3
If you don't see a command prompt, try pressing enter.
/ # nslookup kubernetes
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: kubernetes
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
/ #
重启前后ip地址发生变化
重启前
重启后
2.5kubectl自动补全
为了更方便的使用kubectl工具,可以为kubectl配置命令自动补全,这样当有些参数记不清时,就可以使用tap键来触发自动补全参数。
要使用自动补全需要在宿主机中安装一个软件包bash-completion,在master节点操作
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
@mayongjie1
2022-06-17 23:21
字数 7082
阅读 13
原创文章,作者:,如若转载,请注明出处:https://blog.ytso.com/268282.html