目录
一 主机准备
1.1 设备配置
内网Ip/外网 | Name |
---|---|
10.1.57.200/ 12.152.230.21 | K8s-master(4G4核) |
10.1.57.201/39.10.181.51 | K8s-work2(4G4核) |
10.1.57.202/11.230.108.20 | K8s-work3(4G4核) |
⚠️注意1
如果是云服务器,并且内网不在同一网段,则可以参考下面文章进行异地组网
zerotierhttps://blog.csdn.net/hey_lie/article/details/131304142?spm=1001.2014.3001.5501
⚠️注意2
主机的配置master配置可以略差,当node节点的配置最低2核2G【最好按自己的环境按最高的来,否则后期加入kubesphere等会失败】
1.2 环境准备
# 1.关闭防火墙,普通方式,生成环境应开放相应的端口并打开防火墙
# 这里选择关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 2.关闭selinux,让容器可以读取主机文件系统
# 永久关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config
# 临时关闭
setenforce 0
# 3.关闭swap
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
# 4.根据规划设置主机名k8s-master,k8s-work1,k8s-work2
hostnamectl set-hostname <hostname>
# 5./etc/hosts中添加dns映射
cat >> /etc/hosts << EOF
10.1.57.200 k8s-master
10.1.57.201 k8s-work1
10.1.57.202 k8s-wokr2
EOF
# 6.将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 7.时间同步
yum install ntpdate -y
ntpdate time.windows.com
# 8.让配置生效
sysctl --system
# 9.重启,关闭swap,需要重启才生效
reboot
1.3docker安装
参考下面的文章
安装指定版本dockerhttps://blog.csdn.net/hey_lie/article/details/131019165?spm=1001.2014.3001.5501
二 安装kubeadm、kubectl、kubelet
2.1 添加镜像源
由于国内网络原因,因此我们需要安装镜像方可下载
参考链接kubernetes镜像_kubernetes下载地址_kubernetes安装教程-阿里巴巴开源镜像站
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
2.2 安装
下载
yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
运行
systemctl enable kubelet
三 master节点部署
apiserver-advertise-address:10.1.57.200 为master节点主机的内网ip
image-repository镜像仓库选择阿里云
service-cidr为service网段【一般不用改】
pod-network-cidr为pod网段【一般不用改】
kubeadm init \
--apiserver-advertise-address=10.1.57.200 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.6 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
执行完成后会出现下面的日志
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.1.57.200:6443 --token yz9i3n.tuldbmd9decu7t3j \
--discovery-token-ca-cert-hash sha256:fad63729371f74839347b1ac0dd772eaff9402a40365f2f07e9331311e451107
如果在执行过程中出现
/proc/sys/net/ipv4/ip_forward contents are not set to 1
则修改/proc/sys/net/ipv4/ip_forward内容为1后继续重新执行init
echo "1" > /proc/sys/net/ipv4/ip_forward
安装完成后按照日志提示执行管理员配置,使其可以在任意位置执行kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
验证 执行命令:kubectl get nodes
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane,master 42s v1.23.6
四 node节点加入集群
在node节点执行上面init时的kubeadm join...命令
执行成功后,在master节点继续查看节点,即可发现节点已经加入成功
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane,master 2m39s v1.23.6
k8s-work1 NotReady <none> 71s v1.23.6
如果init日志忘记,需要创建密钥进行加入,具体方式如下:
在master中查看是否存在密钥
kubeadm token list
#返回
TOKEN TTL EXPIRES USAGES
wjxs21.v0tbteb0vahnu2sa 19h 2023-06-08T02:57:15Z authentication,signing
如果没有则创建一个密钥
kubeadm token create
#返回即使密钥
krblln.39wff92dh0lx48iq
接着通过这个密钥创建一个验证码
执行下面的命令
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'
返回一个hash值
#返回一个hash值
46cfc95eecefa09197ca5b25925b20c8816759585969151d04de55c08c8f821f
拼接 sha256:
#前面拼接"sha256:"
sha256:46cfc95eecefa09197ca5b25925b20c8816759585969151d04de55c08c8f821f
node节点执行
密钥为刚才的到的密钥
hash值为刚才的到的hash值
kubeadm join 10.1.57.200:6443 --token 密钥 \
--discovery-token-ca-cert-hash hash值
五 CNI网络插件calico
CNI
容器网络接口,就是在网络解决方案由网络插件提供,这些插件配置容器网络则通过CNI定义的接口来完成,也就是CNI定义的是容器运行环境与网络插件之间的接口规范。这个接口只关心容器的网络连接,在创建容器是分配网络,删除容器是移除网络。插件就是对CNI的规范的具体实现
[k8s与calico版本对比参考] https://docs.tigera.io/calico/latest/getting-started/kubernetes/community-tested
版本选择为v3.23
选择一个文件夹,下载calico文件
mkdir /opt/k8s/cni
cd /opt/k8s/cni
curl https://docs.projectcalico.org/v3.23/manifests/calico.yaml -O
下载完成后,编辑该文件
1. 将CALICO_IPV4POOL_CIDR设置为与初始化(master中kubelet init的pod-network-cidr)的 cidr 相同
2. 配置networkmanager
cat > /etc/NetworkManager/conf.d/calico.conf <<EOF
[keyfile]
unmanaged-devices=interface-name:cali*;interface-name:tunl*;interface-name:vxlan.calico;interface-name:wireguard.cali
EOF
3. 删除镜像 docker.io/ 前缀,避免下载过慢导致失败【能访问外网可以省略】
sed -i 's#docker.io/##g' calico.yaml
4.如果下载很慢,可以提前下载镜像
如果下载失败,可以去docker hub搜索下载
docker pull quay.io/calico/cni:v3.23.5
docker pull quay.io/calico/kube-controllers:v3.23.5
docker pull quay.io/calico/node:v3.23.5
docker pull quay.io/calico/pod2daemon-flexvol:v3.23.5
docker pull quay.io/calico/typha:v3.23.5
5.构建calico应用
kubectl apply -f calico.yaml
验证
等待一段时间后,查看命名空间为kube-system下的pod,观察calico-node-xxx状态都为running,ready都为1,coredns同样如此,说明网络插件已经安装完成
#查看命名空间为kube-system下的pod
kubectl get pods -n kube-system
#结果如下
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-66bf87d4b8-pvl92 1/1 Running 0 3h43m
calico-node-bm7l2 1/1 Running 0 3h43m
calico-node-pdzr5 1/1 Running 0 3h43m
calico-node-wz7cj 1/1 Running 0 3h43m
coredns-6d8c4cb4d-9nm7p 1/1 Running 0 5h10m
coredns-6d8c4cb4d-b9glg 1/1 Running 0 5h10m
#接着查看node状态,应处于ready状态
kubectl get nodes
#信息如下,此时status应该为noready
NAME STATUS ROLES AGE VERSION
k8s-master1 Ready control-plane,master 4h51m v1.23.6
k8s-work1 Ready <none> 4h49m v1.23.6
k8s-work2 Ready <none> 4h48m v1.23.6
六 其他节点使用kubectl
目前只能在master节点使用kubectl,需要在node节点使用,则需要下面操作
1.拷贝文件
将 master 节点中 /etc/kubernetes/admin.conf 拷贝到需要两个work节点的 /etc/kubernetes 目录中
使用scp命令进行远程拷贝
#scp 文件路径 远程登录用户名@ip:目标文件夹
scp /etc/kubernetes/admin.conf root@k8s-work1:/etc/kubernetes
2.添加到环境变量
#添加环境变量到配置文件
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
#让环境变量文件生效
source ~/.bash_profile
至此,node节点也可以使用kubectl了
七 节点离开集群
#节点停止调度
kubectl cordon nodename
#节点驱逐pod
kubectl drain nodename
#节点删除
kubectl delete node nodename