【k8s集群应用】Kubernetes二进制部署实例(master02+负载均衡)+Dashboard

发布于:2024-12-20 ⋅ 阅读:(14) ⋅ 点赞:(0)

配置指南

master02 节点上部署 Kubernetes 组件

  1. master01 节点复制证书文件、配置文件和服务管理文件到 master02 节点:
    scp -r /opt/etcd/ root@20.0.0.66:/opt/
    scp -r /opt/kubernetes/ root@20.0.0.66:/opt
    scp -r /root/.kube root@20.0.0.66:/root
    scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@20.0.0.66:/usr/lib/systemd/system/
    
  2. 修改 kube-apiserver 配置文件中的 IP 地址:
    vim /opt/kubernetes/cfg/kube-apiserver
    # 修改 --bind-address 和 --advertise-address 为 20.0.0.66
    
    KUBE_APISERVER_OPTS="--logtostderr=true \
    --v=4 \
    --etcd- servers=https://20.0.0.10:2379,https://20.0.0.58:2379,https://20.0.0.59:2379 \
    --bind-address=20.0.0.66 \				#修改
    --secure-port=6443 \
    --advertise-address=20.0.0.66 \			#修改
    ......
    
    
  3. master02 节点上启动并设置服务开机自启:
    systemctl start kube-apiserver.service
    systemctl enable kube-apiserver.service
    systemctl start kube-controller-manager.service
    systemctl enable kube-controller-manager.service
    systemctl start kube-scheduler.service
    systemctl enable kube-scheduler.service
    
  4. 验证 kubectl 命令是否可用,并查看节点状态:
    ln -s /opt/kubernetes/bin/* /usr/local/bin/
    kubectl get nodes
    kubectl get nodes -o wide
    #-o=wide:输出额外信息;对于Pod,将输出Pod所在的Node名
    

此时在master02节点查到的node节点状态仅是从etcd查询到的信息,而此时node节点实际上并未与master02节点建立通信连接,因此需要使用一个VIP把node节点与master节点都关联起来

配置负载均衡器(Nginx + Keepalived)

lb01lb02 节点上操作

  1. 配置 Nginx 的官方在线 yum 源并安装 Nginx:

    cat > /etc/yum.repos.d/nginx.repo << 'EOF'
    [nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/centos/7/\$basearch/
    gpgcheck=0
    EOF
    yum install nginx -y
    
  2. 修改 Nginx 配置文件以配置四层反向代理负载均衡:
    配置四层反向代理负载均衡,指定k8s群集2台master的节点ip和6443端口

    vim /etc/nginx/nginx.conf
    # 添加 stream 块
    stream {
        log_format  main  '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
        access_log  /var/log/nginx/k8s-access.log  main;
    
        upstream k8s-apiserver {
            server 20.0.0.10:6443;
            server 20.0.0.66:6443;
        }
        server {
            listen 6443;
            proxy_pass k8s-apiserver;
        }
    }
    

    检查配置文件语法并启动 Nginx,查看已监听6443端口

    nginx -t
    systemctl start nginx
    systemctl enable nginx
    netstat -natp | grep nginx 
    
  3. 安装 Keepalived 并配置:

    yum install keepalived -y
    vim /etc/keepalived/keepalived.conf
    # 根据节点角色(MASTER 或 BACKUP)修改配置
    # lb01 为 MASTER,lb02 为 BACKUP
    

    示例配置(MASTER 节点):

    # 接收邮件地址
    ! Configuration File for keepalived
    global_defs {
       notification_email {
         acassen@firewall.loc
         failover@firewall.loc
         sysadmin@firewall.loc
       }
     # 邮件发送地址
       notification_email_from Alexandre.Cassen@firewall.loc
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id NGINX_MASTER#lb02节点的为 NGINX_BACKUP
    }
    # 添加一个周期性执行的脚本
    vrrp_script check_nginx {
        script "/etc/nginx/check_nginx.sh"
    }
    
    vrrp_instance VI_1 {
        state MASTER #lb02节点的为 BACKUP
        interface ens33 #指定网卡名称 ens33
        virtual_router_id 51 #指定vrid,两个节点要一致
        priority 100 #lb01节点的为 100,lb02节点的为 90
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            20.0.0.100/24 #指定 VIP
        }
        track_script {
            check_nginx #指定vrrp_script配置的脚本
        }
    }
    

    创建检查脚本并赋予执行权限

    vim /etc/nginx/check_nginx.sh
    #!/bin/bash
    count=$(ps -ef | grep nginx | egrep -cv "grep|$$")
    if [ "$count" -eq 0 ];then
        systemctl stop keepalived
    fi
    chmod +x /etc/nginx/check_nginx.sh
    # 启动 Keepalived
    systemctl start keepalived
    systemctl enable keepalived
    # 检查 VIP 是否生成
    ip a
    

修改 Node 节点上的配置文件并使用 VIP

  1. 在所有 Node 节点上,修改 bootstrap.kubeconfigkubelet.kubeconfigkube-proxy.kubeconfig 文件中的 server 地址为 VIP(20.0.0.100):
    cd /opt/kubernetes/cfg/
    vim bootstrap.kubeconfig
    # 修改 server 地址为 https://20.0.0.100:6443
    vim kubelet.kubeconfig
    # 修改 server 地址为 https://20.0.0.100:6443
    vim kube-proxy.kubeconfig
    # 修改 server 地址为 https://20.0.0.100:6443
    # 重启 kubelet 和 kube-proxy 服务
    systemctl restart kubelet.service
    systemctl restart kube-proxy.service
    
  2. 在 lb01 上查看 nginx 和 node 、 master 节点的连接状态
    netstat -natp | grep nginx
    tcp        0      0 0.0.0.0:6443            0.0.0.0:*               LISTEN      44904/nginx: master 
    tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      44904/nginx: master 
    tcp        0      0 20.0.0.100:6443     20.0.0.59:46954     ESTABLISHED 44905/nginx: worker 
    tcp        0      0 20.0.0.13:45074     20.0.0.10:6443      ESTABLISHED 44905/nginx: worker 
    tcp        0      0 20.0.0.13:53308     20.0.0.66:6443      ESTABLISHED 44905/nginx: worker 
    tcp        0      0 20.0.0.13:53316     20.0.0.66:6443      ESTABLISHED 44905/nginx: worker 
    tcp        0      0 20.0.0.100:6443     20.0.0.58:48784     ESTABLISHED 44905/nginx: worker 
    tcp        0      0 20.0.0.13:45070     20.0.0.10:6443      ESTABLISHED 44905/nginx: worker 
    tcp        0      0 20.0.0.100:6443     20.0.0.58:48794     ESTABLISHED 44905/nginx: worker 
    tcp        0      0 20.0.0.100:6443     20.0.0.59:46968     ESTABLISHED 44905/nginx: worker 
    

master01 节点上测试 Pod 的创建和访问

  1. 测试创建 Pod:

    kubectl run nginx --image=nginx
    
  2. 查看 Pod 状态:

    kubectl get pods 
    NAME                    READY   STATUS              RESTARTS   AGE
    nginx-dbddb74b8-nf9sk   0/1     ContainerCreating   0          33s   #正在创建中
    
    kubectl get pods
    NAME                    READY   STATUS    RESTARTS   AGE
    nginx-dbddb74b8-nf9sk   1/1     Running   0          80s  			#创建完成,运行中
    
    kubectl get pods -o wide
    NAME                    READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE
    nginx-dbddb74b8-26r9l   1/1     Running   0          10m   172.17.36.2   20.0.0.14   <none>
    //READY为1/1,表示这个Pod中有1个容器
    
  3. 在对应网段的 Node 节点上使用浏览器或 curl 命令访问 Pod:

    curl <Pod IP>
    
  4. 查看 Pod 日志(如果需要):

    kubectl logs <Pod 名称>
    
  5. (可选)绑定默认 cluster-admin 管理员集群角色,授权集群操作权限(如果执行失败):

    kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
    

Dashboard

Dashboard 介绍

仪表板是基于Web的Kubernetes用户界面。您可以使用仪表板将容器化应用程序部署到Kubernetes集群,对容器化应用程序进行故障排除,并管理集群本身及其伴随资源。您可以使用仪表板来概述群集上运行的应用程序,以及创建或修改单个Kubernetes资源(例如deployment,job,daemonset等)。例如,您可以使用部署向导扩展部署,启动滚动更新,重新启动Pod或部署新应用程序。仪表板还提供有关群集中Kubernetes资源状态以及可能发生的任何错误的信息。

部署Dashboard

在Kubernetes集群的master01节点上部署

上传recommended.yaml文件到/opt/k8s目录

修改recommended.yaml文件

  • 使用vim或其他文本编辑器打开recommended.yaml文件,并找到Kubernetes Dashboard的Service部分。
  • 默认Dashboard只能集群内部访问,所以将Service类型修改为NodePort,并添加nodePort字段以暴露到外部。
cd /opt/k8s
vim recommended.yaml

在文件中找到并修改Service部分如下:

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001     # 添加此行
  type: NodePort          # 修改此行
  selector:
    k8s-app: kubernetes-dashboard

应用修改后的recommended.yaml文件

使用kubectl apply命令应用修改后的配置。

kubectl apply -f recommended.yaml

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

创建名为dashboard-admin的service account,并绑定到cluster-admin角色。

kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

获取并描述secret以获取token

获取dashboard-admin的token。

Skubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

访问Dashboard

https://NodeIP:30001
NodeIP是Kubernetes集群中任意节点的IP地址。
在登录页面使用前面获取的token进行登录。

https://NodeIP:30001