前言
前面两篇我们已经安装配置好了集群的服务器环境,接下来我们正式的开始安装和部署k8s集群,我们按照上一篇规划的软件版本进行部署。
k8s集群的安装目前官方推荐的有3种,分别为kubeadm、Kops、Kubespray,我们这里选择kubeadm方式。
K8s集群规划
部署架构图
软件规划
软件名 | 版本 | 作用 |
---|---|---|
操作系统 | CentOS 7.9_x86_64 minimal | 虚拟机安装的操作系统版本 |
Docker | 20-CE | 容器运行时环境,我们演示使用Docker(满足CRI标准接口的容器运行时均可) |
Kubernetes | 1.23 | K8s版本,这里演示使用1.23,目前最新1.25,从官网可见 |
系统配置及集群安装
在所有node节点进行如下配置,包括:master和node1/node2。
系统配置 [所有节点]
# 第一步:关闭防火墙【已执行】
# 关闭原因:iptables防火墙会对网络流量进行过滤、转发,如果是内网集群一般都进行关闭,防止影响网络性能。
systemctl stop firewalld
systemctl disable firewalld
# 禁用SELinux或者用setenforce 0指令将SELinux设置为许可模式,先临时关闭,并配置永久关闭。
# 关闭原因:linux增加安全组件,很多组件不兼容。另外容器访问主机系统也必须关闭SELinux。
setenforce 0 # 临时
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
# 关闭swap。先临时关闭,并配置永久关闭。
# 关闭原因:内存不足时,Linux会自动使用swap,降低性能,并且无法感知容器OOM。
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
# 在master添加hosts,这里注意修改成自己设置的ip和主机名 [ip] [主机名]
cat >> /etc/hosts << EOF
192.168.4.100 k8s-master
192.168.4.101 k8s-node1
192.168.4.102 k8s-node2
EOF
# 将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 确认是否生效
sysctl --system
# 时间同步,确保各个节点时间同步
yum install ntpdate -y
ntpdate time.windows.com
安装docker [所有节点]
# 安装wget工具
yum -y install wget
# 下载并安装docker,设置默认启动
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce
systemctl enable docker && systemctl start docker
# 配置镜像加速
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# 重启docker并查看docker info
systemctl restart docker
docker info
# docker安装完成后默认会给安装br_netfilter和overlay内核模块,这两个模块是k8s集群必须的两个内核模块
lsmod | grep br_netfilter
lsmod | grep overlay
添加阿里云yum软件源 [所有节点]
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
安装kubeadm,kubelet和kubectl [所有节点]
yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
systemctl enable kubelet
部署Kubernetes Master
1、按照规划我们在k8s-master节点上执行如下命令。
kubeadm init \
--apiserver-advertise-address=192.168.4.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all
• --apiserver-advertise-address 集群通告地址
• --image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
• --kubernetes-version K8s版本,与上面安装的一致
• --service-cidr 集群内部虚拟网络,Pod统一访问入口
• --pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致
注意📢:初始化完成后,最后会输出一个join命令,拷贝下来,后续会用到。
kubeadm join 192.168.4.100:6443 --token opktqp.uwlxgl62iwj6k046 \
--discovery-token-ca-cert-hash sha256:6a482b3fa0bcd60c150fe5739a6f41f30a304bf5ceee6674c2d58358c17fef8e
2、拷贝kubectl使用的连接k8s认证文件到默认路径,在master节点作为kuectl的管理节点。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3、使用kubectl get nodes查看工作节点。
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane,master 5m36s v1.23.0
注意📢:由于网络插件还没有部署,还没有准备就绪 NotReady,我们先继续往下部署。
4、在worker node1和node2执行步骤2输出的kubeadm join指令,将node1和node2加入到集群管理。
kubeadm join 192.168.4.100:6443 --token opktqp.uwlxgl62iwj6k046 \
--discovery-token-ca-cert-hash sha256:6a482b3fa0bcd60c150fe5739a6f41f30a304bf5ceee6674c2d58358c17fef8e
此时我们在master节点通过kubectl get nodes命令查看集群节点,发现增加了node1和node2节点。
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane,master 12m v1.23.0
k8s-node1 NotReady <none> 21s v1.23.0
k8s-node2 NotReady <none> 14s v1.23.0
注意📢:kubeadm join 默认token有效期为24小时
kubeadm join 192.168.4.100:6443 --token opktqp.uwlxgl62iwj6k046 \ --discovery-token-ca-cert-hash sha256:6a482b3fa0bcd60c150fe5739a6f41f30a304bf5ceee6674c2d58358c17fef8e
当过期之后需要重新创建token,可以直接使用命令快捷生成:
kubeadm token create --print-join-command
部署容器网络(CNI) [master节点]
Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。
1、下载calico yaml文件。
wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate
2、下载完后修改里面定义Pod网络(CALICO_IPV4POOL_CIDR)。
# 打开calico.yaml文件找到CALICO_IPV4POOL_CIDR
# 修改value与前面kubeadm init的--pod-network-cidr=10.244.0.0/16保持一致
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
3、对calico.yaml进行部署。
kubectl apply -f calico.yaml
kubectl get pods -n kube-system
4、确认所有的calico pod都运行起来了(因为涉及到镜像拉取和容器启动,会比较慢,需要等待)。
[root@k8s-master ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-67c466d997-nm9vj 1/1 Running 0 4m44s
calico-node-4xp5k 1/1 Running 0 4m44s
calico-node-cw6cf 0/1 Init:0/3 0 4m44s
calico-node-tzkf8 1/1 Running 0 4m44s
coredns-6d8c4cb4d-t4l7t 1/1 Running 0 28m
coredns-6d8c4cb4d-x2mbl 1/1 Running 0 28m
etcd-k8s-master 1/1 Running 0 31m
kube-apiserver-k8s-master 1/1 Running 0 31m
kube-controller-manager-k8s-master 1/1 Running 0 31m
kube-proxy-8jxkd 1/1 Running 0 18m
kube-proxy-9cb2j 1/1 Running 0 28m
kube-proxy-s9hg8 1/1 Running 0 18m
kube-scheduler-k8s-master 1/1 Running 0 31m
5、确认所有的nodes状态为ready状态。
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 36m v1.23.0
k8s-node1 Ready <none> 23m v1.23.0
k8s-node2 Ready <none> 23m v1.23.0
注意📢:k8s的安装目录和组件配置文件目录在如下两个位置。
安装目录:/etc/kubernetes/
组件配置文件目录:/etc/kubernetes/manifests/
总结
至此我们已经将整个k8s集群部署完成了,我们可以在集群的master节点上进行相应的学习和演练,来逐步的理解k8s的一些概念以及一些基本原理。
评论区