Kubernetes集群搭建部署

一、提要
部署 Kubernetes 集群至少需要 3 台服务器,其中至少要有 1 个服务器做 master 节点,至少要有 1 个服务器做 node 节点,且节点名称是唯一的。

当集群中只有一个 master 节点时,如果其出现了故障,会导致 Kubernetes 的控制平面完全失效。如要保证 Kubernetes 集群的高可靠性,可以设置多个 master,当其中部分 master 出现故障时,其他 master 还可以管理整个集群。

因此,我们这里使用三台服务器部署,可以有 2 种部署方案,2 个 master+1 个 node,或者 1 个 master+2 个 node,这里我们使用后一种方式。

三台服务器:

master,192.168.4.145
node1,192.168.4.146
node2,192.168.4.147

二、部署
修改主机名


# master 机器执行命令
hostnamectl set-hostname master

# node1 机器执行命令
hostnamectl set-hostname node1

# node2 机器执行命令
hostnamectl set-hostname node2

关闭防火墙:


# 3 台机器都执行
systemctl stop firewalld
systemctl disable firewalld

关闭 selinux:


# 3 台机器都执行
sed -i 's/enforcing/disabled/' /etc/selinux/config

关闭 swap 分区:


# 3 台机器都执行
vim /etc/fstab

注释掉该行:/dev/mapper/centos-swap
编辑/etc/hosts 文件,新增以下内容:


# 3 台机器都执行
192.168.4.145 master master
192.168.4.146 node1 node1
192.168.4.147 node2 node2

创建并编辑/etc/sysctl.d/k8s.conf,新增以下内容:


# 主要是为了将桥接的 IPv4 流量传递到 iptables
# 只在 master 机器上执行
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

执行命令:


# 只在 master 机器上执行
sysctl --system

配置时间同步:


# 3 台机器都执行
yum -y install chrony

编辑/etc/chrony.conf 文件,新增以下内容:


# 3 台机器都执行
pool time1.aliyun.com iburst

执行命令:


# 3 台机器都执行
systemctl enable --now chronyd

免密认证:


# 只在 master 机器上执行
ssh-keygen -t rsa
ssh-copy-id master
ssh-copy-id node1
ssh-copy-id node2

重启机器:


# 3 台机器都执行
reboot

安装 docker:


# 3 台机器都执行
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce
systemctl start docker
systemctl enable docker
docker -v

创建并编辑/etc/yum.repos.d/kubernetes.repo,新增以下内容:


# 主要是为了添加 Kubernetes 的源
# 3 台机器都执行
[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/

安装 kubeadm、kubelet、kubectl:
注:1.24 以上版本已经放弃 docker,如果安装,k8s 在初始化时会报错


# 3 台机器都执行
yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
systemctl enable kubelet

执行命令:


# 只在 master 机器上执行
docker pull coredns/coredns:1.8.5
docker tag coredns/coredns:1.8.5 registry.aliyuncs.com/google_containers/coredns:v1.8.5

创建并编辑/etc/docker/daemon.json,新增以下内容:


# 3 台机器都执行
{
    "exec-opts": ["native.cgroupdriver=systemd"]
}

执行命令:


# 3 台机器都执行
systemctl daemon-reload
systemctl restart docker
systemctl restart kubelet

部署 Kubernetes master 节点:


# 只在 master 机器上执行
kubeadm init  \
--apiserver-advertise-address=192.168.4.145 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.6 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16

-----------------------单行用于复制------------------------------
kubeadm init --apiserver-advertise-address=192.168.4.145 --image-repository registry.aliyuncs.com/google_

如有问题通过百度解决,漫长等待后,记录下以下值:


kubeadm join 192.168.4.145:6443 --token zqlnxn.b8110o37bp5kwinl \
        --discovery-token-ca-cert-hash sha256:69cf2bd1bf87495d1e2e5dc11b3736151feaf00e38a59ea66b276007a163a

如下图所示:

执行命令:


# 只在 master 机器上执行
echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' > /etc/profile.d/k8s.sh
source /etc/profile.d/k8s.sh

安装 Pod 网络插件:


# 只在 master 机器上执行
# 网上找到 kube-flannel.yml 下载下来之后手动安装
kubectl apply -f /root/kube-flannel.yml

生成 worker 节点用来加入集群的校验 token:


# 只在 master 机器上执行
kubeadm token create --print-join-command
kubeadm join 192.168.4.145:6443 --token zqlnxn.b8110o37bp5kwinl --discovery-token-ca-cert-hash sha256:69cf2bd1bf87495d1e2e5dc11b3736151feaf00e38a59ea66b276007a163a0aa

加入 Kubernetes 的 Node 节点:


# 在两个 node 机器上执行
echo "1" > /proc/sys/net/bridge/bridge-nf-call-iptables
kubeadm join 192.168.4.145:6443 --token zqlnxn.b8110o37bp5kwinl --discovery-token-ca-cert-hash sha256:69cf2bd1bf87495d1e2e5dc11b3736151feaf00e38a59ea66b276007a163a0aa

master 绑定:


# 在两个 node 机器上执行
echo "export KUBECONFIG=/etc/kubernetes/kubelet.conf" >> /etc/profile
source /etc/profile

查看节点状态(三台机器均可查看),如下图所示:

至此,如果解决完所有报错,则部署结束。

三、测试 Kubernetes 集群
执行命令:


# 只在 master 机器上执行
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc

如图所示:

浏览器访问:

四、Kubernetes 实践
以下只在 master 机器上执行

4.1、Deployment 资源部署
集群上运行 Nginx 镜像:


kubectl run nginx --image=nginx

查看部署的 Nginx 应用:


kubectl get deployments.apps nginx

查看 Nginx 部署的详细信息及过程:


kubectl describe deploy nginx

查看 Nginx 的 ReplicaSet 资源:


# DESIRED-副本数期望值,CURRENT-当前副本数,READY-就绪状态的副本数,AGE-已启动时间
kubectl get rs

查看 Nginx 的 Pod 资源:


kubectl get pod -o wide

4.2、Deployment 日志查看
查看 Nginx 的应用日志:


kubectl logs nginx-85b98978db-kxvn6

4.3、Deployment 资源执行
通过 kubectl 进入 Nginx 应用对应的容器:


kubectl exec -it nginx-85b98978db-kxvn6 bash

查看 Service 和 Pod 的映射关系:


kubectl get endpoints

4.4、Deployment 资源扩展
扩展 Nginx 应用的副本数为 3(原来是 1):


kubectl scale deployment nginx --replicas=3

扩展后查看 Nginx 应用的 Deployment、ReplicaSet、Pod、Endpoints 资源:


kubectl get deployment.apps nginx
kubectl get rs
kubectl get pod
kubectl get ep

4.5、资源删除
删除对应的 Deployment 资源(通过 kubectl run 启动的):


kubectl rollout undo deploy nginx

检验删除结果:


kubectl get pod

删除对应的 Service 资源(通过 kubectl apply 启动的):


kubectl delete -f /tmp/nginx.svc.yml

4.6、故障排查
查看 Nginx 的应用日志:


kubectl logs nginx-85b98978db-kxvn6

输出资源的详细信息:


kubectl describe pod nginx-85b98978db-kxvn6
© 版权声明

☆ END ☆
喜欢就点个赞吧
点赞0 分享
图片正在生成中,请稍后...