K8S 集群搭建

1、搭建清单

  • 2台linux服务器(一个master节点,一个node节点),建议搭3台(一个master,两个node)

我使用的是腾讯云,节点与节点使用公网IP通信

确保2台服务器都安装了docker

2、服务器前置工作

  • 如果是本机启动多个linux虚拟机,可忽略

建议学习阶段关闭防火墙及安全策略

如果需要添加安全组端口放行,我这里附上我的端口放行列表

放行端口如下:

  1. 8080:选择性放行,这个在证书会使用到,建议放行
  2. ping命令需要使用到ICMP协议的端口建议全部放行,不然在ping时会失败
  3. 6443:kube-apiserver 的通信端口。
  4. 2379:etcd 的 client 端口。
  5. 2380:etcd 的 peer 端口。
  6. 10250:kubelet 的安全端口,用于与 kube-apiserver 通信。
  7. 10251:kube-controller-manager 的安全端口,用于与 kube-apiserver 通信。
  8. 10252:kube-scheduler 的安全端口,用于与 kube-apiserver 通信。
  9. 还有一个dashboard端口,这个是在安装dashboard时动态生成的,注意下

3、K8S前置工作

K8S要求虚拟机必须配置的内容,如下:

#各个机器设置自己的域名

#master节点为:k8s-master,node节点为:k8s-node01

hostnamectl set-hostname xxxx

将 SELinux 设置为 permissive 模式(相当于将其禁用)

sudo setenforce 0

sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

#关闭swap

swapoff -a

sed -ri 's/.*swap.*/#&/' /etc/fstab

#允许 iptables 检查桥接流量

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf

br_netfilter

EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

EOF

sudo sysctl --system

4、安装kubelet、kubeadm、kubect

kubelet、kubeadm、kubect为K8S所有节点的三大件(每个节点都必须存在的)

注意:处理kubelet是以后台运行方式运行,其他的组件都是通过docker运行

  • 指定下载的yum源

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo

kubernetes

name=Kubernetes

baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64

enabled=1

gpgcheck=0

repo_gpgcheck=0

gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg

http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

exclude=kubelet kubeadm kubectl

EOF

  • 下载(最好加sudo,有些系统即使是root,下载时也会卡主)

    sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes

  • 启动kubelet

    sudo systemctl enable --now kubelet

kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环

5、使用kubeadm引导集群

5.1、下载各个机器需要的镜像
  • 在2个linux创建脚本
bash 复制代码
sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
done
EOF

注意:上述镜像是master节点所需的镜像,而node节点只需要 kube-proxy即可,为了防止搭建过程失败,可以再node节点中安装上述所有镜像

如果只安装kube-proxy,脚本应为:

bash 复制代码
sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-proxy:v1.20.9
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
done
EOF
  • 授权
bash 复制代码
chmod +x images.sh
  • 执行
bash 复制代码
./images.sh
5.2、修改节点信息
  • 集群的入口就是master节点

给所有服务器添加master节点信息

#cluster-endpoint 集群入口,这里的集群入口就是master节点的IP地址,111.230.19.178为master节点的公网IP

echo "111.230.19.178 cluster-endpoint" >> /etc/hosts

5.3、初始化主节点
bash 复制代码
kubeadm init \
--apiserver-advertise-address=111.230.19.178 \
--control-plane-endpoint=cluster-endpoint \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16
  • --apiserver-advertise-address=111.230.19.178 表示主节点的IP地址
  • --control-plane-endpoint 表示控制屏的入口,必须与5.2一致
  • --image-repository 表示镜像仓库,这里用的是阿里云
  • --kubernetes-version K8S的版本
  • --service-cidr 集群内部负载均衡使用的
  • --pod-network-cidr

注意:必须保证service-cid与pod-network-cidr不能重叠,且不能与master和所有的node重叠

5.4、记初始化失败解决方案

这个失败问题,首先需要明确解决该问题的思路

思路如下:

  • kubectl服务是以后台方式运行的,其他的组件服务都是以docker方式运行的
  • 首先明确kubectl服务是否正常
  • 再找docker运行的k8s组件服务是否正常

1> 明确kubectl服务是否正常

bash 复制代码
systemctl status kubelet
  • active (running) 即表示是正常,下面的日志不需要看

2>docker运行的k8s组件服务是否正常

kubeadm init 其实就是在启动docker中的容器,初始化失败的话,也就证明容器启动是失败的,我们去定位到底是哪个容器失败了,如下

bash 复制代码
docker ps -a

定位到2个容器启动失败,如下:

  1. k8s_etcd 【就是etcd组件】
  2. k8s_kube-apiserver 【kube-apiserver组件】

查看容器启动时日志:

  • 注意:docker会自动重启失败的K8S容器,也就意味着失败容器的镜像ID会经过一段时间后改变,如果docker logs报没有这个容器,请在docker ps -a一次!!!
bash 复制代码
docker logs 容器ID/容器名称

etcd容器出现的错误:

etcdmain: listen tcp 111.230.19.178:2380: bind: cannot assign requested address,就是绑定这个IP+端口失败了

kube-apiserver出现的错误:

Err :connection error: desc = "transport: Error while dialing dial tcp 127.0.0.1:2379: connect: connection refused"

注意:kube-apiserver连接2379端口(2379:etcd的client端口),其实就是去连接etcd!!!我们只需要解决etcd就可以了

解决方案:参考:天翼云服务器部署 k8s etcdmain: listen tcp xx.xx.xx.xx:2380: bind: cannot assign requested address-CSDN博客

实测没问题

5.5、master初始化成功后操作

内容需要记录,这里面有node节点加入master集群的token信息(该token有效期为24h)

  • 如果25htoken过期,可以在master节点使用下面命令重新生成token
bash 复制代码
kubeadm token create --print-join-command

Your Kubernetes control-plane has initialized successfully!

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/

You can now join any number of control-plane nodes by copying certificate authorities

and service account keys on each node and then running the following as root:

kubeadm join cluster-endpoint:6443 --token 8vtydf.izdgell5pz20sm8n \

--discovery-token-ca-cert-hash sha256:c91feabc45fb32737dc63a491ef5f41d41c1c80660ebb48e1aef487a27130f98 \

--control-plane

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join cluster-endpoint:6443 --token 8vtydf.izdgell5pz20sm8n \

--discovery-token-ca-cert-hash sha256:c91feabc45fb32737dc63a491ef5f41d41c1c80660ebb48e1aef487a27130f98

  • 在master节点中,执行init初始化成功后,信息里面的3句命令:
bash 复制代码
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
5.6、安装网络插件
  • 这里插件选择的是calico,推荐使用fannel

在master节点执行

bash 复制代码
curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O

使用calico

bash 复制代码
kubectl apply -f calico.yaml
  • apply:应用什么
  • -f:表示file 文件

注意,calico.yaml文件中,有一处与master初始化时是一致的,如果kubectl init时,pod-network-cidr=192.168.0.0/16 calico默认也是192.168

查看k8s当前节点信息

bash 复制代码
kubectl get nodes
5.7、kubectl常用命令

#查看集群所有节点
kubectl get nodes

#根据配置文件,给集群创建资源
kubectl apply -f xxxx.yaml

#查看集群部署了哪些应用?等同于docker ps
kubectl get pods -A

# 运行中的应用在docker里面叫容器,在k8s里面叫Pod

5.8、加入node节点

在kubectl init中,把node节点加入命令复制,在node节点的机器上执行即可

  • 先 docker images 查看镜像是否都有
  • 执行node节点添加命令(我的在步骤5.5中)

如果执行join时失败,如下

accepts at most 1 arg(s), received 3

To see the stack trace of this error execute with --v=5 or higher

请把join命令在记事本中打开,编辑下格式,可能是shell连接工具导致的错误

  • 在master节点中执行:
bash 复制代码
kubectl get nodes
  • 注意:如果node节点为noReady,可以等一会,k8s还在初始化
5.9、删除node节点

<1> 先查看一下这个node节点上的pod信息

bash 复制代码
kubectl get nodes -o wide

<2> 驱逐该node节点上的pod

bash 复制代码
kubectl drain k8s-node01 --delete-local-data --force --ignore-daemonsets

<3> 删除这个node节点

bash 复制代码
kubectl delete nodes k8s-node01

至此,集群搭建完毕


6、安装集群可视化界面dashboard

6.1、K8S applydashboard
  • 在主节点中执行:
bash 复制代码
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml

如果无反应,可以在浏览器访问网址,然后在linux中新建yaml文件,把网页中的内容复制进yaml中,再kubectl apply -f yaml文件

  • 使用命令查看k8s的dashboard
bash 复制代码
kubectl get pod -A
6.2、配置dashboard端口
  • 修改dashboard配置文件
bash 复制代码
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
  • 找到type: ClusterIP,把type改为NodePort
  • 把dashboard的WEB访问页面的端口暴露到机器上(类似于docker -p端口映射)
bash 复制代码
kubectl get svc -A |grep kubernetes-dashboard
  • 注意:云服务器安全组需要放行该端口
  • 我的访问链接为(https请求):https://111.230.19.178:32473
  • 上述IP可以使用任意节点的IP都可以

注意,在访问前,一定要坚持所有的pods是否允许成功,否则访问会失败

bash 复制代码
kubectl get pods -A
6.3、生成k8s访问账号密码
  • 创建访问账号,准备一个yaml文件; vi dash.yaml

    #创建访问账号,准备一个yaml文件; vi dash.yaml
    apiVersion: v1
    kind: ServiceAccount
    metadata:
    name: admin-user
    namespace: kubernetes-dashboard

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
    name: admin-user
    roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: ClusterRole
    name: cluster-admin
    subjects:

    • kind: ServiceAccount
      name: admin-user
      namespace: kubernetes-dashboard
  • K8S应用该脚本
bash 复制代码
kubectl apply -f dash.yaml
  • 获取访问令牌
bash 复制代码
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"

eyJhbGciOiJSUzI1NiIsImtpZCI6Ik02dmU1ZnBScUIxaE45YUdYWUJqZmVvY3FyYmVkSkNXZHhTaVp4bmZxdk0ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXZwZjJjIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5ZDBlZDcwOC1kOTJlLTQzOTQtOTA0OS04N2UxNjJmZmZmODIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.luGUTFWDp79_UUa02-cBo44Vqs4JahXcNpqIe4IYAA93-WNr-5s3lCHuHXnWtY-eGMDqCqCuBMWnChIdKi97ZvxF6JcwOFkd0EEi04pM-EOGT37nJHGjx4KhjWPU4VQZgP9c172DD8HAMe6_VF4PEarB4lrTUXJqoAMufYO13rVRw8WxS-RPDfXSc7d2nEcy0x_fYd1LEKXwfYq_PvJFnoE2STNAbXcazQbfe0cKbyInkOpbhY_gV4WU1FH8pHNH3BQ4E-Hs6VO9UWujZ3f7jphlMPlIRnprg55CeHSvYHsrX6s6SDMGaWfLfa9REgSkzE-mPelV16EocffLhmMZFg

  • 登录dashboard

复制上述令牌,登录即可

整合成功

相关推荐
❀͜͡傀儡师2 小时前
docker 安装数据集成平台 Apache SeaTunnel 服务
docker·容器
B1nna4 小时前
Docker学习
学习·docker·容器
缘友一世4 小时前
网安系列【15】之Docker未授权访问漏洞
docker·容器
armcsdn15 小时前
基于Docker Compose部署Traccar容器与主机MySQL的完整指南
mysql·docker·容器
铅笔侠_小龙虾17 小时前
Docker 实战 -- Mysql
mysql·docker·容器
阿里云云原生17 小时前
Higress MCP 服务管理,助力构建私有 MCP 市场
云原生
IvanCodes17 小时前
三、Docker常用命令
docker·容器
zzywxc78719 小时前
云原生 Serverless 架构下的智能弹性伸缩与成本优化实践
云原生·架构·serverless