• 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 < br_netfilter
    EOF

    cat < 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 < [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创建脚本
    1. sudo tee ./images.sh <<-'EOF'
    2. #!/bin/bash
    3. images=(
    4. kube-apiserver:v1.20.9
    5. kube-proxy:v1.20.9
    6. kube-controller-manager:v1.20.9
    7. kube-scheduler:v1.20.9
    8. coredns:1.7.0
    9. etcd:3.4.13-0
    10. pause:3.2
    11. )
    12. for imageName in ${images[@]} ; do
    13. docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
    14. done
    15. EOF

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

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

    1. sudo tee ./images.sh <<-'EOF'
    2. #!/bin/bash
    3. images=(
    4. kube-proxy:v1.20.9
    5. )
    6. for imageName in ${images[@]} ; do
    7. docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
    8. done
    9. EOF
    • 授权
    chmod +x images.sh
    • 执行
    ./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、初始化主节点
    1. kubeadm init \
    2. --apiserver-advertise-address=111.230.19.178 \
    3. --control-plane-endpoint=cluster-endpoint \
    4. --image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
    5. --kubernetes-version v1.20.9 \
    6. --service-cidr=10.96.0.0/16 \
    7. --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服务是否正常

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

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

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

    docker ps -a

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

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

    查看容器启动时日志:

    • 注意:docker会自动重启失败的K8S容器,也就意味着失败容器的镜像ID会经过一段时间后改变,如果docker  logs报没有这个容器,请在docker  ps  -a一次!!!
    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
    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句命令:
    1. mkdir -p $HOME/.kube
    2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    3. sudo chown $(id -u):$(id -g) $HOME/.kube/config

    5.6、安装网络插件
    • 这里插件选择的是calico,推荐使用fannel

    在master节点执行

    curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O

    使用calico

    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当前节点信息

    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节点中执行:
    kubectl get nodes
    • 注意:如果node节点为noReady,可以等一会,k8s还在初始化 

    5.9、删除node节点

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

    kubectl get nodes -o wide

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

    kubectl drain k8s-node01 --delete-local-data --force --ignore-daemonsets

    <3> 删除这个node节点

    kubectl delete nodes k8s-node01

    至此,集群搭建完毕


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

    6.1、K8S applydashboard
    • 在主节点中执行:
    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
    kubectl get pod -A

    6.2、配置dashboard端口
    • 修改dashboard配置文件
    kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
    • 找到type: ClusterIP,把type改为NodePort

    • 把dashboard的WEB访问页面的端口暴露到机器上(类似于docker -p端口映射)
    kubectl get svc -A |grep kubernetes-dashboard

    • 注意:云服务器安全组需要放行该端口
    • 我的访问链接为(https请求):https://111.230.19.178:32473
    • 上述IP可以使用任意节点的IP都可以

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

    kubectl get pods -A

    • 访问成功:https://111.230.19.178:32473

    6.3、生成k8s访问账号密码
    • 创建访问账号,准备一个yaml文件; vi dash.yaml
    1. #创建访问账号,准备一个yaml文件; vi dash.yaml
    2. apiVersion: v1
    3. kind: ServiceAccount
    4. metadata:
    5. name: admin-user
    6. namespace: kubernetes-dashboard
    7. ---
    8. apiVersion: rbac.authorization.k8s.io/v1
    9. kind: ClusterRoleBinding
    10. metadata:
    11. name: admin-user
    12. roleRef:
    13. apiGroup: rbac.authorization.k8s.io
    14. kind: ClusterRole
    15. name: cluster-admin
    16. subjects:
    17. - kind: ServiceAccount
    18. name: admin-user
    19. namespace: kubernetes-dashboard

    • K8S应用该脚本
    kubectl apply -f dash.yaml
    • 获取访问令牌
    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

    复制上述令牌,登录即可

    整合成功

  • 相关阅读:
    压缩感知常用的重建算法
    多版本node的安装与切换详细操作
    服务器模拟互联网服务
    计算机毕业设计Java计算机培训管理(源码+系统+mysql数据库+lw文档)
    Tauri 打包
    Lua与Java的交互方案
    3D Gaussian Splatting Windows安装
    Python程序设计——哈达玛矩阵的实现以及详解
    文科生的爬藤神器:HIEEC哈佛国际经济学论文比赛
    2.初学者初始Elasticsearch
  • 原文地址:https://blog.csdn.net/weixin_42675423/article/details/134390742