• kubernetes安装并测试


    kubernetes 学习

    一. kubernetes 安装

    目前生产部署 Kubernetes 集群主要有两种方式:

    • kubeadm
    • 二进制安装

    1. kubeadm 安装

    官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

    本次测试只是单纯的搭建 kubernetes ,暂时不做其他容器化操作

    1.1 kubeadm 部署方式介绍

    kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具,这个工具能通过两条指令完成一个Kubernetes 集群的部署:

    1. 创建一个Master节点 kubeadm init
    2. 将Node节点加入到当前集群中$ kubeadm join

    1.2 服务器及安装环境规划

    👉 服务器要求:

    • 建议最小硬件配置:2核CPU、2G内存、20G硬盘(安装完成之后查看硬盘使用大概在4~5G)
    • 服务器最好可以访问外网,会有从网上拉取镜像需求,如果服务器不能上网,需要提前下载对应镜像并导入节点

    👉 本次测试服务器规划如下:

    IP节点规划系统版本
    192.168.169.150masterCentOS Linux release 7.9.2009 (Core)
    192.168.169.151node01CentOS Linux release 7.9.2009 (Core)
    192.168.169.152node02CentOS Linux release 7.9.2009 (Core)

    👉 软件版本:

    名称版本
    dockerDocker version 20.10.17
    kubernetesKubernetes v1.23.0

    ❓ 如何查看版本信息?

    • docker
    docker -v
    
    • 1
    • kubeadm
    kubeadm version
    
    • 1
    • kubelet
    kubelet --version
    
    • 1
    • kubeclt
    kubectl version
    
    • 1

    1.3 初始化服务器配置

    💥 初始化服务器配置在所有节点上操作

    1️⃣ 关闭防火墙

    生产环境看要求

    [root@master ~]# systemctl stop firewalld
    [root@master ~]# systemctl disable firewalld
    
    • 1
    • 2

    2️⃣ 禁用 selinux

    # 直接编辑文件
    vim /etc/selinux/config
    # 修改 SELINUX 为 disabled
    SELINUX=disabled
    或者
    sed -i 's/enforcing/disabled/' /etc/selinux/config
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3️⃣ 关闭 swap 分区

    swap 分区的作用是当物理内存不足时,利用 swap 分区做数据交换

    在 Kubernetes 1.22 之前,节点不支持使用交换内存,并且默认情况下, 如果在节点上检测到交换内存配置,kubelet 将无法启动。 在 1.22 以后,可以逐个节点地启用交换内存支持。

    本次测试选择关闭 swap 分区

    详情参考官网:https://kubernetes.io/zh-cn/docs/concepts/architecture/nodes/#swap-memory

    # 临时关闭,重启服务器后就不生效了
    swapoff -a
    
    # 永久关闭
    # 直接编辑文件
    vim /etc/fstab
    # 将 swap 注释,修改完成需要重启
    # /dev/mapper/centos-swap swap                    swap    defaults        0 0
    或者
    sed -i 's/.*swap.*/#&/' /etc/fstab			# 同样需要重启
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    4️⃣ 设置系统主机名以及 Host 文件的相互解析

    生产一般是用自己内部的 DNS 解析

    [root@master ~]# hostnamectl set-hostname master01
    [root@master ~]# exit
    登出
    # 登出后在连接,即可看见修改后的主机名,或者执行 bash 命令,也会立即生效
    [root@master ~]# bash
    
    cat >> /etc/hosts << EOF
    192.168.169.150 maste01
    192.168.169.151 node01
    192.168.169.152 node02
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    5️⃣ 将桥接的 IPv4 流量传递到 iptables 的链

    有一些 ipv4 的流量不能走 iptables 链 (linux内核的一个过滤器,每个流量都会经过他,然后再匹配是否可进入当前应用进程去处理),导致流量丢失。(这个内核详细的我也不懂 😿 )

    cat > /etc/sysctl.d/k8s.conf << EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    
    # 使配置生效
    sysctl --system
    
    # 查看是否加载成功
    lsmod | grep br_netfilter
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    6️⃣ 时间同步

    因为 k8s 的证书对于时间同步要求比较严格,所以这里需要配置一个时间同步的操作

    # 使用 centos 自带的 chronyd(这个相对方便一点)
    systemctl  start  chronyd.service
    systemctl  enable  chronyd.service
    
    或者
    
    yum install ntpdate -y
    ntpdate time.windows.com
    # 注意:虚拟机不管关机还是挂起,每次重新操作都需要更新时间进行同步。好像也需要配置定时同步 crontab
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    7️⃣ 安装 Docker

    安装 docker

    本次测试默认安装最新版本,如果需要自定义安装版本,

    可参考:https://blog.csdn.net/D1179869625/article/details/122909512

    # 下载阿里的 yum 源
    wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
    
    # 使用 yum 安装 docker
    yum -y install docker-ce
    
    # 启动 docker 并设置开机自启
    systemctl start docker
    systemctl enable docker
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    配置 docker 镜像加速器

    登陆自己的阿里云搜索 ”容器镜像服务“

    在这里插入图片描述

    在这里插入图片描述

    # 创建之前可以检查一下是否存在,在启动 docker 之后就会创建这个文件,但是阿里的这个配置文件是不全面的,需要添加另外一个配置,参考下面的全面配置
    sudo mkdir -p /etc/docker	
    
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://2oka4vlk.mirror.aliyuncs.com"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    注意:这里配置阿里云加速时一定要加上下面一段,不然在 kubeadm init 的时候会报错

     "exec-opts": [
        "native.cgroupdriver=systemd"
      ],
    
    • 1
    • 2
    • 3

    daemon.json整体配置如下:

    tee /etc/docker/daemon.json <<-'EOF'
    {
    "exec-opts": ["native.cgroupdriver=systemd"],
    "registry-mirrors": ["https://2oka4vlk.mirror.aliyuncs.com"]
    }
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    # 重启 docker
    systemctl restart docker
    
    # 查看 docker 安装信息
    docker info
    
    • 1
    • 2
    • 3
    • 4
    • 5

    8️⃣ 安装 kubeadm、kubelet、kubectl

    配置阿里云的 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    安装 kubeadm、kubelet、kubectl
    yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
    
    # 注意,这里安装之后不需要启动,只需要设置开机自启即可
    systemctl enable kubelet
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    1.4 部署 kubernetes

    注意:没有特殊说明的都是在 master 上进行操作

    1️⃣ kubeadm 部署

    这里执行 kubeadm init 会比较慢,要等一会

    kubeadm init \
      --apiserver-advertise-address=192.168.169.150 \
      --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中保持一致
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    注意:如果在执行 kubeadm init 失败后,可以使用 kubeadm reset 清除之前初始化环境信息,再重新执行 kubeadm init

    • 初始化完成之后会有一个 kubeadm join 的口令,是让 node 节点加入到 master 用的

    在这里插入图片描述

    • 如果说找不到上面的 jointoken 口令,或者说过期了(默认有效期 24 小时),可以使用下面的命令生成
     kubeadm token create --print-join-command
    
    • 1

    2️⃣ 将从节点加入到 master(在从节点执行)

    在从节点执行 master 中生成的 token 口令

    kubeadm join 192.168.169.150:6443 --token kqz2y5.rquvsfoctr5pqqvk \
    	--discovery-token-ca-cert-hash sha256:a679ff960780720182d15f4c5659c1489f1067551a6de4bb688e10dc967965c0
    
    • 1
    • 2

    在这里插入图片描述

    • 删除一个节点(在 master 上操作)
    # 查看所有节点信息
    [root@master01 ~]# kubectl get nodes
    NAME       STATUS   ROLES                  AGE   VERSION
    master01   Ready    control-plane,master   27h   v1.23.0
    node01     Ready    <none>                 27h   v1.23.0
    node02     Ready    <none>                 27h   v1.23.0
    
    # 删除节点 node01
    [root@master01 ~]# kubectl delete node node01
    node "node01" deleted
    
    # 再次查看节点信息
    [root@master01 ~]# kubectl get nodes
    NAME       STATUS   ROLES                  AGE   VERSION
    master01   Ready    control-plane,master   27h   v1.23.0
    node02     Ready    <none>                 27h   v1.23.0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 将节点重新加入到集群中(在从节点上执行操作)
    # 在 node 节点上重置一下
    kubeadm reset
    
    # 然后在 master 节点上执行获取 token
    kubeadm token create --print-join-command
    
    # 在 node 节点上执行
    kubeadm join 192.168.169.150:6443 --token i6rwyb.i2ijphzdb4cpbi5q --discovery-token-ca-cert-hash sha256:a679ff960780720182d15f4c5659c1489f1067551a6de4bb688e10dc967965c0
    
    执行完以上操作即可将删除的节点再次加入到集群中
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 查看节点详细信息
    # 语法
    kubectl describe nodes <name>
    
    # 示例:
    [root@master01 ~]# kubectl describe nodes node01
    Name:               node01
    Roles:              <none>
    Labels:             beta.kubernetes.io/arch=amd64
                        beta.kubernetes.io/os=linux
                        kubernetes.io/arch=amd64
                        kubernetes.io/hostname=node01
                        kubernetes.io/os=linux
    Annotations:        kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
                        node.alpha.kubernetes.io/ttl: 0
                        projectcalico.org/IPv4Address: 192.168.169.151/24
                        projectcalico.org/IPv4IPIPTunnelAddr: 10.244.196.128
                        volumes.kubernetes.io/controller-managed-attach-detach: true
    CreationTimestamp:  Sat, 02 Jul 2022 21:07:57 +0800
    
    . . . . . . . . . . . . . . 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    3️⃣ 拷贝k8s认证文件

    参考官网:官网地址

    官网中有对 TLS 证书错误 做解答

    在这里插入图片描述

    mkdir -p $HOME/.kube
    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    chown $(id -u):$(id -g) $HOME/.kube/config
    
    # 查看节点信息,如果没有拷贝认证文件,是看不到节点信息的
    kubectl get nodes
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    由于没有配置网络插件,所以这里看到节点信息都是 NotReady (未就绪)的

    4️⃣ 配置容器网络

    Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。

    • 下载 YAML 文件
     wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate
    
    • 1
    • 修改 calico.yaml 文件配置

    修改里面定义 Pod 网络(CALICO_IPV4POOL_CIDR),与前面 kubeadm init--pod-network-cidr 指定的一样,这里修改为 10.244.0.0/16

    注意:这里默认是注释的,在配置的时候要注意缩进,yaml 文件对于缩进要求比较严苛

    在这里插入图片描述

    • 修改完成就可以部署了
    # 执行命令之后需要等一会进行操作,需要等到全部状态为 running 时
    kubectl apply -f calico.yaml
    
    # 使用如下命令查看全部命名空间下的运行情况(官方推荐使用)
    kubectl get pods --all-namespaces
    
    # 也可以使用如下命令查看 kube-system 命名空间下的运行情况
    kubectl get pods -n kube-system
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    等 STATUS 状态全部为 Running 时,节点状态就会改变

    在这里插入图片描述

    在这里插入图片描述

    5️⃣ 查看节点详细信息

    详情参考官网:官网地址

    • 语法
    kubectl describe node <节点名称>
    
    • 1
    • 示例
    kubectl describe node node01
    
    • 1

    1.5 部署 Dashboard

    Dashboard 是官方提供的一个 UI,可用于基本管理 K8s 资源

    1️⃣ 下载 YAML 文件

    wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
    
    • 1

    2️⃣ 修改配置文件

    默认 Dashboard 只能集群内部访问,添加 ServiceNodePort 类型,暴露到外部,注意 yaml缩进

    这里增加了如下两个参数:

    nodePort: 30001 默认值:30000-32767,如果不配置这个参数,它就会自动随机生成一个端口

    type: NodePort 配置为NodePort,外部可以访问

    kind: Service
    apiVersion: v1
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
      name: kubernetes-dashboard
      namespace: kubernetes-dashboard
    spec:
      ports:
        - port: 443
          targetPort: 8443
          nodePort: 30001
      selector:
        k8s-app: kubernetes-dashboard
      type: NodePort
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    3️⃣ 部署 Dashboard

    kubectl apply -f recommended.yaml
    
    • 1

    在这里插入图片描述

    4️⃣ 查看状态及端口

    [root@master01 ~]# kubectl get pods,svc -n kubernetes-dashboard
    NAME                                             READY   STATUS    RESTARTS        AGE
    pod/dashboard-metrics-scraper-799d786dbf-x7xxx   1/1     Running   1 (4h36m ago)   4h57m
    pod/kubernetes-dashboard-6b6b86c4c5-67cp5        1/1     Running   1 (4h36m ago)   4h57m
    
    NAME                                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
    service/dashboard-metrics-scraper   ClusterIP   10.106.114.201   <none>        8000/TCP        4h57m
    service/kubernetes-dashboard        NodePort    10.97.128.83     <none>        443:30001/TCP   4h57m
    
    
    参数解析:
    svc			命名空间(可以看到 service 暴露的端口,对内是 443,对外是前面在文件中配置的 30001,如果不指定端口,那么这里将随机生成一个对外暴露的端口)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    6️⃣ 访问测试

    浏览器输入:https://masterip:30001

    这里是:https://192.168.169.150:30001/

    注意:要是 https 如果是 http 它会给你一个提示 Client sent an HTTP request to an HTTPS server

    关机之后第二天登陆的时候发现 Google Chrome 连接不了,查看状态也是正常的。然后换个浏览器就好了,不知道为什么。

    在这里插入图片描述

    7️⃣ 创建service account并绑定默认cluster-admin管理员集群角色

    可参考:https://blog.csdn.net/weixin_55609944/article/details/119763303

     # 创建用户
    kubectl create serviceaccount dashboard-admin -n kube-system
    
    # 用户授权
    kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
    
    # 获取令牌秘钥
    kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
    
    具体参数解析后期再加上
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    • 将上面生成的 token 填写到登陆页面中
    eyJhbGciOiJSUzI1NiIsImtpZCI6Im9LTlE3LTV5eHVTNjZqdDJZeGxzOGNWUFozR1RiQVVzeXZHNXIxNWZIalUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tOXM4amciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiOGU2OWY3Y2YtNTgzZC00OTgwLTgxN2YtYWU4ZGVkNmEyODhjIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.thyMQGCmugnXJkX9FLvAxA43G0yThMRwbtMTRWBhUhB53_lPyx53P9zkUc4MLPtDu1WQNlAHpg8iT2wl2h4_hTDPUPovxItWvqPS8YowVoexZuy6ejXhUHPftxBo5UAc5aRwbfJtzW_QMbOfeNDcLvqvguCcNslYZyfEuTtgSAylt8UbCx27RQ3QWB3y37NeHoA4RicP3mG3CSnmMcRiq4HVVb1NuWHsgcqtEL10EI21Rq6_NPGl1IFoGGV1MzUvtyJdXMmFuBoGCUvLx1Xj8b6d0vn2YnttqdH8kzMfUzYzPgYmyOfNXIYbLU7LZ6Q-C6CqyFlSjcMxeo06QNn5Wg
    
    • 1

    在这里插入图片描述

    1.6 总结

    使用 kubeadm 搭建 kubernetes 就到这里了,这里就只是简单的安装操作。

    参考文档:博客传送门

    视屏参考:B站传送门

    1.7 问题

    官方总结的问题参考:官网地址

    以下是个人在安装时遇到的问题,基本都是不细心造成的问题。

    1️⃣ 问题一

    ❓ 如果遇到如下报错

    [root@master01 ~]# kubeadm init \
    >   --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
    [init] Using Kubernetes version: v1.23.0
    [preflight] Running pre-flight checks
    [preflight] Pulling images required for setting up a Kubernetes cluster
    [preflight] This might take a minute or two, depending on the speed of your internet connection
    [preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
    [certs] Using certificateDir folder "/etc/kubernetes/pki"
    [certs] Generating "ca" certificate and key
    [certs] Generating "apiserver" certificate and key
    [certs] apiserver serving cert is signed for DNS names [kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local master01] and IPs [10.96.0.1 192.168.169.150]
    [certs] Generating "apiserver-kubelet-client" certificate and key
    [certs] Generating "front-proxy-ca" certificate and key
    [certs] Generating "front-proxy-client" certificate and key
    [certs] Generating "etcd/ca" certificate and key
    [certs] Generating "etcd/server" certificate and key
    [certs] etcd/server serving cert is signed for DNS names [localhost master01] and IPs [192.168.169.150 127.0.0.1 ::1]
    [certs] Generating "etcd/peer" certificate and key
    [certs] etcd/peer serving cert is signed for DNS names [localhost master01] and IPs [192.168.169.150 127.0.0.1 ::1]
    [certs] Generating "etcd/healthcheck-client" certificate and key
    [certs] Generating "apiserver-etcd-client" certificate and key
    [certs] Generating "sa" key and public key
    [kubeconfig] Using kubeconfig folder "/etc/kubernetes"
    [kubeconfig] Writing "admin.conf" kubeconfig file
    [kubeconfig] Writing "kubelet.conf" kubeconfig file
    [kubeconfig] Writing "controller-manager.conf" kubeconfig file
    [kubeconfig] Writing "scheduler.conf" kubeconfig file
    [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
    [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
    [kubelet-start] Starting the kubelet
    [control-plane] Using manifest folder "/etc/kubernetes/manifests"
    [control-plane] Creating static Pod manifest for "kube-apiserver"
    [control-plane] Creating static Pod manifest for "kube-controller-manager"
    [control-plane] Creating static Pod manifest for "kube-scheduler"
    [etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
    [wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
    [kubelet-check] Initial timeout of 40s passed.
    [kubelet-check] It seems like the kubelet isn't running or healthy.
    [kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused.
    [kubelet-check] It seems like the kubelet isn't running or healthy.
    [kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused.
    [kubelet-check] It seems like the kubelet isn't running or healthy.
    [kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused.
    [kubelet-check] It seems like the kubelet isn't running or healthy.
    [kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused.
    [kubelet-check] It seems like the kubelet isn't running or healthy.
    [kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused.
    
    	Unfortunately, an error has occurred:
    		timed out waiting for the condition
    
    	This error is likely caused by:
    		- The kubelet is not running
    		- The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled)
    
    	If you are on a systemd-powered system, you can try to troubleshoot the error with the following commands:
    		- 'systemctl status kubelet'
    		- 'journalctl -xeu kubelet'
    
    	Additionally, a control plane component may have crashed or exited when started by the container runtime.
    	To troubleshoot, list all containers using your preferred container runtimes CLI.
    
    	Here is one example how you may list all Kubernetes containers running in docker:
    		- 'docker ps -a | grep kube | grep -v pause'
    		Once you have found the failing container, you can inspect its logs with:
    		- 'docker logs CONTAINERID'
    
    error execution phase wait-control-plane: couldn't initialize a Kubernetes cluster
    To see the stack trace of this error execute with --v=5 or higher
    [root@master01 ~]#  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74

    这里在执行 kubeadm init 时报错,就是因为在配置 docker 文件时出错了。参考 [配置 docker 镜像加速器](# 配置 docker 镜像加速器)

    可参考:https://blog.csdn.net/qq_33326449/article/details/119699126

    2️⃣ 问题二

    ❓ 如果遇到下面报错

    详细说明:

    在访问 Dashboard 时,页面提示如下内容,则是因为访问是没有使用 https

    可参考:https://blog.csdn.net/HYZX_9987/article/details/119575710

    Client sent an HTTP request to an HTTPS server
    
    • 1

    2. 二进制安装 kubernetes

    暂时没写

    3. 简单创建一个 nginx

    • 简单部署流程

    在这里插入图片描述

    • 个人理解简单的一个访问流程

    在这里插入图片描述

    • Pod

    Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一 个进程。

    • Deployment

    Deployment是k8s中用来管理发布的控制器,用于更高级别的部署和管理 pod

    • Service

    为一组 pod 提供负载均衡,对外提供统一的访问入库

    • Label

    标签,Label其实就一对 key/value ,用于关联到对象、查询和筛选

    3.1 使用命令行部署一个应用程序

    👉 用 deployment 控制器部署镜像

    • 创建一个 namespace
    # 语法
    kubectl create namespace <name>
    
    # 示例
    [root@master01 ~]# kubectl create namespace demo-wep
    
    # 查看 namespace
    [root@master01 ~]# kubectl get namespaces
    NAME                   STATUS   AGE
    default                Active   30h
    demo-web               Active   30m
    kube-node-lease        Active   30h
    kube-public            Active   30h
    kube-system            Active   30h
    kubernetes-dashboard   Active   29h
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 使用 deployment 部署一个 nginx 服务

    详情查看官网:官网传送门

    # 使用 deployment 控制器部署镜像
    [root@master01 ~]# kubectl create deployment nginx-demo --image=nginx --replicas=3 -n demo-web
    deployment.apps/nginx-demo created
    
    参数解析:
    	kubectl create deployment				使用 deployment 方式创建 pod 管理器的方式创建 pod
    	web					自定义的服务名称,一般要求具有唯一性
    	--image=nginx		镜像
        --replicas=3		副本数(或者称为实例数)
        -n demo-wep			指定命名空间(如果不指定,则默认为 default)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 查看生成的 pod 实例
    # 查看生成的 pod 实例(创建的时候指定了命名空间,那么在查询的时候也需要指定命名空间)
    [root@master01 ~]# kubectl get pods -n demo-web
    NAME                          READY   STATUS              RESTARTS   AGE
    nginx-demo-5dfc44fcdb-26ncr   0/1     ContainerCreating   0          53s
    nginx-demo-5dfc44fcdb-4ftcv   1/1     Running             0          53s
    nginx-demo-5dfc44fcdb-hnvnk   1/1     Running             0          53s
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 删除一个 pod 实例
    # 删除一个 pod
    kubectl delete pod <NAME> [namespace]
    # 示例:
    [root@master01 ~]# kubectl delete pod nginx-demo-5dfc44fcdb-26ncr -n demo-web
    pod "nginx-demo-5dfc44fcdb-26ncr" deleted
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 查看创建的 deployment
    # 查看创建的 deployment
    [root@master01 ~]# kubectl get deployment -n demo-web
    NAME         READY   UP-TO-DATE   AVAILABLE   AGE
    nginx-demo   3/3     3            3           3m1s
    
    • 1
    • 2
    • 3
    • 4
    • 查看 deployments 部署详细信息
    [root@master01 ~]#  kubectl describe deployments -n demo-web
    
    Name:                   nginx-demo
    Namespace:              demo-web
    CreationTimestamp:      Sun, 03 Jul 2022 00:48:52 +0800
    Labels:                 app=nginx-demo
    Annotations:            deployment.kubernetes.io/revision: 1
    Selector:               app=nginx-demo
    Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
    StrategyType:           RollingUpdate
    MinReadySeconds:        0
    RollingUpdateStrategy:  25% max unavailable, 25% max surge
    Pod Template:
      Labels:  app=nginx-demo
      Containers:
       nginx:
        Image:        nginx
        Port:         <none>
        Host Port:    <none>
        Environment:  <none>
        Mounts:       <none>
      Volumes:        <none>
    Conditions:
      Type           Status  Reason
      ----           ------  ------
      Progressing    True    NewReplicaSetAvailable
      Available      True    MinimumReplicasAvailable
    OldReplicaSets:  <none>
    NewReplicaSet:   nginx-demo-5dfc44fcdb (3/3 replicas created)
    Events:
      Type    Reason             Age    From                   Message
      ----    ------             ----   ----                   -------
      Normal  ScalingReplicaSet  5m17s  deployment-controller  Scaled up replica set nginx-demo-5dfc44fcdb to 3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 删除一个 deployment
    # 删除一个 deployment
    [root@master01 ~]# kubectl delete deployment web
    deployment.apps "web" deleted
    
    • 1
    • 2
    • 3

    3.2 用 YAML 文件创建部署

    可以直接在 kubernetes 官网搜索相关文档

    参考地址:https://kubernetes.io/zh-cn/docs/home/

    在这里插入图片描述

    一般前几个就可以满足我们的参考需求

    在这里插入图片描述

    在这里插入图片描述

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx2
      template:
        metadata:
          labels:
            app: nginx2
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    上面这个 YAML 文件就等同于 kubectl create deployment nginx-deployment-image=nginx --replicas=3

    参数说明:

    详情参考官网地址:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/#creating-a-deployment

    参数含义
    apiVersion创建该对象所使用的 Kubernetes API 的版本
    kind想要创建的对象的类别
    metadata帮助唯一性标识对象的一些数据,包括一个 name 字符串、UID 和可选的 namespace
    spec资源规格
    replicas副本(实例)数量
    selector标签选择器,与下面的 metadata.labels 保持一致
    templatePod 模板
    metadataPod 元数据
    specPod 规格
    containers容器配置
    • apiVersion: apps/v1

    这个版本号是会发生变化的,我们可以通过官方文档查看最新版本信息,也可以通过如下命令获取

    [root@master01 ~]# kubectl api-resources | grep deployment
    deployments                       deploy       apps/v1                                true         Deployment
    
    • 1
    • 2
    • 执行 YAML 文件
    [root@master01 ~]# kubectl apply -f nginx.yaml 
    deployment.apps/nginx-deployment created
    [root@master01 ~]# kubectl get pods
    NAME                                READY   STATUS              RESTARTS   AGE
    nginx-deployment-57774bb9bf-kb8ls   0/1     ContainerCreating   0          10s
    nginx-deployment-57774bb9bf-tgfh2   0/1     ContainerCreating   0          10s
    nginx-deployment-57774bb9bf-vzrrf   0/1     ContainerCreating   0          10s
    [root@master01 ~]# kubectl get deployment
    NAME               READY   UP-TO-DATE   AVAILABLE   AGE
    nginx-deployment   3/3     3            3           57s
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.3 使用 service 将 pod 暴露出去

    1️⃣ 使用命令行将 pod 端口暴露出去

    # 使用 service 将 pod 暴露出去
    [root@master01 ~]# kubectl expose deployment nginx-demo --port=80 --target-port=80 --type=NodePort -n demo-web
    service/nginx-demo exposed
    
    [root@master01 ~]# kubectl get service -n demo-web
    NAME         TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
    nginx-demo   NodePort   10.110.255.35   <none>        80:32011/TCP   62s		# 这里的 32011 就是对外访问的端口
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2️⃣ 使用 YAML 文件将 pod 端口暴露出去

    官网地址:https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/

    在这里插入图片描述

    在这里插入图片描述

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-deployment
    spec:
      selector:
        app: nginx2
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
      type: NodePort
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    以上 YAML 文件内容就等同于 kubectl expose deployment nginx-demo --port=80 --target-port=80 --type=NodePort

    YAML 文件参数解析:

    name: nginx-deployment 这里的 name 要与上面创建时的 YAML 文件中的 metadata.name: nginx-deployment 保持一致

    app: nginx2 这里则需要和上面创建时的 YAML 文件中的 labels.app: nginx2 保持一致

    targetPort: 80 修改内部访问的端口(暂时没用到,后期在具体写)

    type: NodePort 增加一个对外暴露的端口类型

    • 执行 service YAML 文件
    [root@master01 ~]# kubectl apply -f nginx-service.yaml 
    service/nginx-deployment created
    [root@master01 ~]# kubectl get service
    NAME               TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
    kubernetes         ClusterIP   10.96.0.1      <none>        443/TCP        42h
    nginx-deployment   NodePort    10.107.39.60   <none>        80:32430/TCP   10s
    web                NodePort    10.98.186.66   <none>        80:31431/TCP   18h
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    • 查看 service 关联的 pod 信息
    # 查看所有的 pod 和 service(注意:我这里 service/web 因为是配置了命名空间,所以这里不加命名空间则查看不到)
    [root@master01 ~]# kubectl get pods,service
    NAME                                    READY   STATUS    RESTARTS   AGE
    pod/nginx-deployment-57774bb9bf-kb8ls   1/1     Running   0          18m
    pod/nginx-deployment-57774bb9bf-tgfh2   1/1     Running   0          18m
    pod/nginx-deployment-57774bb9bf-vzrrf   1/1     Running   0          18m
    
    NAME                       TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
    service/kubernetes         ClusterIP   10.96.0.1      <none>        443/TCP        43h
    service/nginx-deployment   NodePort    10.107.39.60   <none>        80:32430/TCP   4m37s
    service/web                NodePort    10.98.186.66   <none>        80:31431/TCP   18h
    
    # 这里就是查看指定命名空间中的 service 和 pod
    [root@master01 ~]# kubectl get pods,service -n demo-web
    NAME                              READY   STATUS    RESTARTS   AGE
    pod/nginx-demo-5dfc44fcdb-4ftcv   1/1     Running   0          11h
    pod/nginx-demo-5dfc44fcdb-65hdg   1/1     Running   0          11h
    pod/nginx-demo-5dfc44fcdb-6xjhm   1/1     Running   0          39m
    
    NAME                 TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
    service/nginx-demo   NodePort   10.110.255.35   <none>        80:32011/TCP   11h
    
    # 查看 service 具体对应的 pod ip
    [root@master01 ~]# kubectl get endpoints
    NAME               ENDPOINTS                                             AGE
    kubernetes         192.168.169.150:6443                                  43h
    nginx-deployment   10.244.140.80:80,10.244.140.81:80,10.244.196.137:80   5m39s
    web                <none>                                                18h
    
    # 查看指定命名空间中的 service 具体对应的 pod ip
    [root@master01 ~]# kubectl get endpoints -n demo-web
    NAME         ENDPOINTS                                               AGE
    nginx-demo   10.244.196.129:80,10.244.196.131:80,10.244.196.135:80   11h
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    3.4 访问测试

    可以使用浏览器访问上面创建的 nginx 服务,而且这里使用集群中的其他的 ip 地址也可以访问

    http://192.168.169.150:32011/
    http://192.168.169.151:32011/
    http://192.168.169.152:32011/
    
    • 1
    • 2
    • 3

    在这里插入图片描述

     
     
     
     
     

  • 相关阅读:
    无涯教程-JavaScript - DELTA函数
    2021年中国研究生数学建模竞赛D题——抗乳腺癌候选药物的优化建模
    OpenLayers-要素属性信息简单弹窗
    Gin学习记录1——认识与下载Gin
    关于一次fullgc告警分析与分布式任务调度框架的选型调研
    SpringBoot整合knife 4j
    mysql
    Python数据分析案例03——天气K均值聚类分析
    标准化助推开源发展丨九州未来参编开源领域4项团体标准正式发布
    影响mysql数据的三个性能指标(TPS\QPS\IOPS)
  • 原文地址:https://blog.csdn.net/D1179869625/article/details/126303213