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

复制上述令牌,登录即可

整合成功

相关推荐
阿里云云原生6 小时前
不改代码也能监控 AI Agent?揭秘 OBI 如何在内核层精准解析 GenAI 语义流量
云原生·agent
众人皆醒我独醉7 小时前
Pod 一直 Terminating,死活删不掉?三个凶手,每一个你都意想不到
面试·kubernetes
飞翔沫沫情8 小时前
K8s Alloy 采集 Pod 控制台日志
云原生·容器·kubernetes
潮起鲸落入海14 小时前
Kubernetes Metric Server, Quota and Limits
容器·kubernetes
梦想的颜色14 小时前
Docker 容器化本地部署 Claude Code 完整硬核教程|隔离沙盒 + 国产模型直连 + 持久化 Skill
运维·容器·ai 工程化·沙盒隔离·docker 本地部署·claude code硬核实战·国内国产模型接入
摇滚侠14 小时前
云原生 Java 架构师的第一课 K8s+Docker+KubeSphere+DevOps 19-25
java·云原生·kubernetes
渣渣盟14 小时前
Docker 运维常用命令手册(含扩容与实战)
运维·docker·容器
我叫张小白。16 小时前
一个微服务电商+社区项目(瓷韵app)的技术深度复盘
docker·微服务·云原生·架构
咕噜咕噜的猪大侠16 小时前
《K8s 核心知识梳理:Deployment 滚动更新、JobCronJob、DaemonSet 和 Service》
云原生·容器·kubernetes
虚心的百褶裙16 小时前
远程调用服务架构设计及zookeeper技术详解(下篇)
分布式·zookeeper·云原生