1. 程式人生 > 其它 >01-kubeadm安裝高可用Kubernetes叢集

01-kubeadm安裝高可用Kubernetes叢集

1、環境規劃

1.1 網段規劃

  • Pod網段:10.244.0.0/16

  • Service網段:10.10.0.0/16

1.2 伺服器規劃

  • 作業系統:CentOS7.x
  • 記憶體:4Gb
  • CPU:4核CPU
  • 硬碟:100Gb
  • 虛擬化:開啟
Kubernetes叢集角色 IP 主機名 安裝的元件
控制節點(Master節點) 192.168.126.10 k8s-master01.staryjie.com API Server
Controller-manager
Scheduler
kubelet
etcd
docker
kube-proxy
keepalived
nginx
calico
控制節點(Master節點) 192.168.126.11 k8s-master02.staryjie.com API Server
Controller-manager
Scheduler
kubelet
etcd
docker
kube-proxy
keepalived
nginx
calico
工作節點(Node節點) 192.168.126.20 k8s-node01.staryjie.com kubelet
kube-proxy
docker
calico
coredns
工作節點(Node節點) 192.168.126.21 k8s-node02.staryjie.com kubelet
kube-proxy
docker
calico
coredns
VIP 192.168.126.8

2、初始化伺服器

2.1 配置IP和主機名

2.1.1 伺服器IP改成靜態IP

靜態IP可以保證伺服器IP不會發生改變,保證環境不會發生改變。

一般雲伺服器都會有固定公網IP,如果是虛擬機器等,可以通過配置靜態IP來實現。

例:

cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.126.10
NETMASK=225.225.225.0
GATEWAY=192.168.126.2
DNS1=223.5.5.5
DNS2=8.8.8.8

修改後,需要重啟網路服務:

systemctl restart network.service

2.1.2 設定主機名

hostnamectl set-hostname k8s-master01.staryjie.com
hostnamectl set-hostname k8s-master02.staryjie.com
hostnamectl set-hostname k8s-node01.staryjie.com
hostnamectl set-hostname k8s-node02.staryjie.com

設定主機名之後,需要重新登陸,或者執行bash命令使其生效。

2.1.3 配置hosts檔案

cat >> /etc/hosts << EOF
192.168.126.10  k8s-master01.staryjie.com
192.168.126.11  k8s-master02.staryjie.com
192.168.126.20  k8s-node01.staryjie.com
192.168.126.21  k8s-node02.staryjie.com
EOF

Kubernetes叢集中每一臺主機都需要配置。

2.1.4 配置免金鑰登陸

# 生成sshkey
ssh-keygen

# ssh-copyid分發sshkey
ssh-copy-id [email protected]
ssh-copy-id [email protected]
ssh-copy-id [email protected]
ssh-copy-id [email protected]

2.1.5 時間同步

yum install -y chrony

systemctl restart chronyd.service
systemctl enable chronyd.service

2.1.6 關閉交換分割槽

# 臨時關閉
swapoff -a

# 永久關閉
vim /etc/fstab
# 註釋swap分割槽

關閉交換分割槽,直接使用記憶體,可以提升效率。在使用kubeadm初始化Kubernetes叢集時,如果沒有關閉swap分割槽,會報錯,如果想要不關閉swap分割槽安裝Kubernetes叢集,在kubeadm init的時候需要加上引數:--ignore-preflight-errors=Swap來解決。

2.1.7 修改核心引數

# 載入模組
modprobe br_netfilter

# 新增核心引數配置
cat >> /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

# 使核心引數生效
sysctl -p /etc/sysctl.d/k8s.conf

2.2 配置防火牆和yum源

2.2.1 關閉防火牆

systemctl stop firewalld.service
systemctl disable firewalld.service

2.2.2 關閉SELINUX

# 臨時關閉
setenforce 0

# 永久關閉
sed -i.bak "s#SELINUX=enforcing#SELINUX=disabled#g" /etc/selinux/config
reboot  # 重啟生效

2.2.3 配置yum源

# 備份yum源
mkdir -p /root/repo.bak/
cd /etc/yum.repos.d
mv ./* /root/repo.bak/

# 更換為阿里雲的CentOS7 yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

# 更換阿里雲的epel 源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

# 新增阿里雲docker-ce源
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

# 新增阿里雲Kubernetes源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 生成快取
yum makecache fast

2.3 配置ipvs

Kubernetes元件kube-proxy支援iptables和ipvs兩種模式。ipvs的支援是從Kubernetes1.8的時候開始支援的。在Kubernetes1.11版本穩定。

iptables和ipvs都是基於核心的netfilter模組實現的。

ipvs採用的是hash表儲存規則,查詢速度會很快。

iptables查詢需要全量掃描規則表,當規則比較多的時候,查詢效率比較低。

  • ipvs為大型叢集提供了更好的可擴充套件性和效能
  • ipvs支援比iptables更復雜的負載均衡演算法(最小負載、最少連線、加權等等)
  • ipvs支援服務健康檢查和連線重試等功能

2.3.1 開啟ipvs

cat > /etc/sysconfig/modules/ipvs.modules << "EOF"
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in ${ipvs_modules}; do
 /sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1
 if [ 0 -eq 0 ]; then
 /sbin/modprobe ${kernel_module}
 fi
done
EOF

# 給予可執行許可權
chmod +x /etc/sysconfig/modules/ipvs.modules

2.3.2 安裝基礎軟體包

yum install -y wget net-tools yum-utils device-mapper-persistent-data nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip ntp libaio-devel vim ncurses-devel autoconf automake zlib-devel python-devel epel-release socat ipvsadm conntrack tree

2.4 安裝Iptables

因為Kubernetes的kube-proxy預設使用的是iptables,所以先提前安裝一下iptablse:

yum install -y iptables-services
systemctl stop iptables.service
systemctl disable iptables.service
iptables -F

2.5 安裝和配置Docker

2.5.1 安裝Docker

yum install -y docker-ce-20.10.6-3.el7 docker-ce-cli-20.10.6-3.el7 containerd.io

systemctl start docker.service
systemctl enable docker.service
systemctl status docker.service

2.5.2 配置加速倉庫

mkdir /etc/docker
cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://rrr9h8xt.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","https://hub-mirror.c.163.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

# 重啟docker
systemctl daemon-reload
systemctl restart docker.service
systemctl status docker.service

3、高可用Kubernetes叢集安裝

3.1 安裝初始化Kubernetes叢集的軟體包

  • kubeadm:Kubernetes官方安裝Kubernetes工具,kubeadm init 、kubeadm join

  • kubelet:啟動、刪除Pod的工具

  • kubectl:操作Kubernetes資源的工具,建立、刪除、修改資源等,控制節點安裝即可。

yum install -y kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6

# kubelet必須設定開機自啟
systemctl start kubelet.service
systemctl enable kubelet.service

systemctl status kubelet.service

在Kubernetes叢集沒有初始化完成之前,kubelet是無法正常啟動的,會一直處於auto-restart狀態。直到Kubernetes叢集的元件全部正常啟動才會顯示running狀態。

3.2 配置keepalived和Nginx實現高可用Kubernetes叢集

Kubernetes叢集Master節點的高可用主要在API Server的高可用,並且我們直到API Server使用的是6443埠,所以我們可以提前將Keeepalived和Nginx使API Server高可用的環境搭建出來。

這裡複用了兩臺Master節點,所以該配置都在兩臺Master節點,如果伺服器足夠,也可以將Nginx單獨出來。

3.2.1 安裝Nginx和Keepalived

# 需要安裝epel源,前面配置yum源的時候已經安裝了
yum install -y nginx keepalived
yum -y install nginx-all-modules.noarch  # 配置檔案中的stream可能不能被識別,需要安裝這個

3.2.2 配置主備節點Nginx配置

主備節點Nginx配置檔案一致:

# 兩臺負載均衡伺服器上的Nginx配置檔案一致

cat > /etc/nginx/nginx.conf << "EOF"
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

# 四層負載均衡,為兩臺Master apiserver元件提供負載均衡
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 192.168.126.10:6443;   # Master1 APISERVER IP:PORT
       server 192.168.126.11:6443;   # Master2 APISERVER IP:PORT
    }

    server {
       listen 16443;  # 由於Nginx和ApiServer在同一臺主機,所以這裡不能使用6443埠,否則會衝突
       proxy_pass k8s-apiserver;
    }
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    server {
        listen       80 default_server;
        server_name  _;
        location / {
        }
    }
}
EOF

3.2.3 Keepalived配置

主節點keepalived配置:

# Nginx Master節點上的配置
cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id NGINX_MASTER
}
vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51 # VRRP 路由 ID例項,每個例項是唯一的
    priority 100    # 優先順序,備伺服器設定 90
    advert_int 1    # 指定VRRP 心跳包通告間隔時間,預設1秒
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虛擬IP
    virtual_ipaddress {
        192.168.126.8/24
    }
    track_script {
        check_nginx
    }
}
EOF

備節點keepalived配置:

# Nginx Backup節點上的配置
cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id NGINX_BACKUP
}
vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51 # VRRP 路由 ID例項,每個例項是唯一的
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.126.8/24
    }
    track_script {
        check_nginx
    }
}
EOF
  • vrrp_script:指定檢查nginx工作狀態指令碼(根據nginx狀態判斷是否故障轉移)
  • virtual_ipaddress:虛擬IP(VIP)

3.2.4 keepalived檢查指令碼

# 兩臺負載均衡伺服器上都要編寫這個指令碼

cat > /etc/keepalived/check_nginx.sh  << "EOF"
#!/bin/bash
count=$(ps -ef |grep nginx |egrep -cv "grep|$$")

if [ "$count" -eq 0 ];then
    exit 1
else
    exit 0
fi
EOF
chmod +x /etc/keepalived/check_nginx.sh

說明:keepalived根據指令碼返回狀態碼(0為工作正常,非0不正常)判斷是否故障轉移。

3.2.5 啟動Nginx和keepalived

systemctl daemon-reload
systemctl start nginx.service
systemctl start keepalived.service
systemctl enable nginx.service
systemctl enable keepalived.service

3.2.6 檢查keepalived工作狀態

ip a

此時,192.168.126.8這個vip已經繫結在k8s-master01.staryjie.com這臺主機上,說明keepalived工作正常。

3.2.7 測試VIP漂移

關閉主節點Nginx,測試VIP是否漂移到備節點伺服器。

# 主節點上關閉nginx
systemctl stop nginx.service

此時VIP在備節點上:

如果主機點上的Nginx重新啟動,VIP會再次會到主節點:

VIP漂移需要一定的時間(一秒鐘左右),在VIP漂移的過程中,服務可能會中斷一會兒。

3.3 kubeadm初始化Kubernetes叢集

3.3.1 生成kubeadm初始化Kubernetes叢集配置檔案

kubeadm-config.yaml

apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.20.6
controlPlaneEndpoint: 192.168.126.8:16443
imageRepository: registry.aliyuncs.com/google_containers
apiServer:
  certSANs:
    - 192.168.126.8
    - 192.168.126.10
    - 192.168.126.11
    - 192.168.126.20
    - 192.168.126.21
networking:
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.10.0.0/16
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
Kind: KubeProxyConfiguration
mode: ipvs

3.3.2 初始化Kubernetes叢集

kubeadm init --config kubeadm-config.yaml

初始化過程如下:

Kubernetes叢集的Master節點初始化成功!

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 如果是root使用者,可以直接執行下面的命令
cat >> /etc/profile << EOF
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF

新增控制節點的命令:

kubeadm join 192.168.126.8:16443 --token xb3oqo.7cahevx14botb50r \
    --discovery-token-ca-cert-hash sha256:936620d5322d3850288a00f4fe1e7514ec79de9c94ab8725fa60c784aa6b2c69 \
    --control-plane

新增工作節點的命令:

kubeadm join 192.168.126.8:16443 --token xb3oqo.7cahevx14botb50r \
    --discovery-token-ca-cert-hash sha256:936620d5322d3850288a00f4fe1e7514ec79de9c94ab8725fa60c784aa6b2c69

3.3.3 kubeadm init流程

3.4 Kubernetes叢集新增Master節點

3.4.1 拷貝控制節點已經生成的證書

# 在k8s-master02.staryjie.com上建立目錄
mkdir -p /etc/kubernetes/pki/etcd/
mkdir -p ~/.kube/

拷貝證書:

# 在k8s-master01.staryjie.com主機上操作
scp /etc/kubernetes/pki/ca.crt [email protected]:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/ca.key [email protected]:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/sa.key [email protected]:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/sa.pub [email protected]:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/front-proxy-ca.crt [email protected]:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/front-proxy-ca.key [email protected]:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/etcd/ca.crt [email protected]:/etc/kubernetes/pki/etcd/
scp /etc/kubernetes/pki/etcd/ca.key [email protected]:/etc/kubernetes/pki/etcd/

3.4.2 新增控制節點

根據初始化集群后的提示命令加入到叢集中:

kubeadm join 192.168.126.8:16443 --token xb3oqo.7cahevx14botb50r \
    --discovery-token-ca-cert-hash sha256:936620d5322d3850288a00f4fe1e7514ec79de9c94ab8725fa60c784aa6b2c69 \
    --control-plane

加入過程如下:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

如果忘記加入叢集的token或者token過期了,可以執行下面的命令:

# 獲取加入叢集的token和命令
kubeadm token create --print-join-command

加入控制節點的時候,需要在上面生成的命令後面加上--control-plane

3.4.3 kubectl命令自定補全

source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

3.4.4 kubeadm join流程

3.5 Kubernetes叢集新增Node節點

根據Kubernetes初始化時候的提示,直接在工作節點上執行:

kubeadm join 192.168.126.8:16443 --token xb3oqo.7cahevx14botb50r \
    --discovery-token-ca-cert-hash sha256:936620d5322d3850288a00f4fe1e7514ec79de9c94ab8725fa60c784aa6b2c69

成功加入Kubernetes叢集:

在控制節點上執行kubectl get nodes:![image-20220302153957665](/Users/staryjie/Library/Application Support/typora-user-images/image-20220302153957665.png)

工作節點上的ROLES顯示為none,如果要讓他顯示為worker,則可以執行下面的命令:

kubectl label node k8s-node01.staryjie.com node-role.kubernetes.io/worker=worker
kubectl label node k8s-node02.staryjie.com node-role.kubernetes.io/worker=worker

然後再次檢視:

此時檢視Kubernetes元件資訊:

kubectl get pods -n kube-system -o wide

此時,coredns處於Pending狀態,是由於網路外掛沒有安裝導致的。

3.6 安裝calico網路外掛

官方文件:https://projectcalico.docs.tigera.io/getting-started/kubernetes/quickstart

3.6.1 獲取calico資原始檔

wget http://docs.projectcalico.org/v3.2/getting-started/kubernetes/installation/hosted/calico.yaml

3.6.2 安裝calico

kubectl apply -f calico.yaml

安裝過程:

3.6.3 檢查安裝結果

kubectl get pods -n kube-system -o wide

此時coredns的狀態變成Running

kubectl get nodes

所有節點的狀態也變成了Ready

3.7 測試Kubernetes叢集網路是否正常

通過建立一個Pod來測試:

kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh

能夠正常訪問網路:

3.8 測試Kubernetes叢集部署Pod

tomcat.yaml:

apiVersion: v1  #pod屬於k8s核心組v1
kind: Pod  #建立的是一個Pod資源
metadata:  #元資料
  name: demo-pod  #pod名字
  namespace: default  #pod所屬的名稱空間
  labels:
    app: myapp  #pod具有的標籤
    env: dev      #pod具有的標籤
spec:
  containers:      #定義一個容器,容器是物件列表,下面可以有多個name
  - name:  tomcat-pod-java  #容器的名字
    ports:
    - containerPort: 8080
    image: tomcat:8.5-jre8-alpine   #容器使用的映象
    imagePullPolicy: IfNotPresent

kubectl apply -f tomcat.yaml

此時Kubernetes叢集內部可以正常訪問到Tomcat服務:

為了能夠在叢集外部也能訪問,我們需要在Pod前面加一個Service:

tomcat-service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: tomcat
spec:
  type: NodePort
  ports:
    - port: 8080
      nodePort: 30080
  selector:
    app: myapp
    env: dev

kubectl apply -f tomcat-service.yaml

部署了一個名為tomcat的Service:

因為Service的型別是NodePort,所以我們可以通過節點IP加埠訪問:

3.9 測試CoreDNS域名解析

kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh

# 測試域名解析
/ # nslookup kubernetes.default.svc.cluster.local
Server:    10.10.0.10  # kube-dns的地址(coredns服務)
Address 1: 10.10.0.10 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes.default.svc.cluster.local
Address 1: 10.10.0.1 kubernetes.default.svc.cluster.local  # Service kubernetes 的地址
/ #

/ # nslookup tomcat.default.svc.cluster.local
Server:    10.10.0.10
Address 1: 10.10.0.10 kube-dns.kube-system.svc.cluster.local

Name:      tomcat.default.svc.cluster.local
Address 1: 10.10.198.59 tomcat.default.svc.cluster.local  # Service tomcat 的地址
/ #

/ # nslookup kube-dns.kube-system.svc.cluster.local
Server:    10.10.0.10
Address 1: 10.10.0.10 kube-dns.kube-system.svc.cluster.local

Name:      kube-dns.kube-system.svc.cluster.local
Address 1: 10.10.0.10 kube-dns.kube-system.svc.cluster.local
/ #

4、安裝Dashboard

官方文件:https://github.com/kubernetes/dashboard

4.1 根據資源清單安裝dashboard

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml

具體安裝什麼版本需要參考官方文件,看哪一個版本能夠相容當前的Kubernetes版本。

安裝之後,Kubernetes會將dashboard的Pod執行在kubernetes-dashboard的名稱空間下:

kubectl get pods -n kubernetes-dashboard -o wide

dashboard的Service也在kubernetes-dashboard名稱空間:

kubectl get svc -n kubernetes-dashboard -o wide

4.2 修改dashboard的Service型別

由於ClusterIP型別的Service無法在叢集外部訪問,所以我們需要將kubernetes-dashboard這個Service的型別改為NodePort

kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

將下圖中的ClusterIP改為NodePort儲存退出即可:

儲存之後:

4.3 外部訪問dashboard

這時候,我們就可以在Kubernetes叢集外部訪問到Dashboard了:

由於dashboard的ssl證書是Kubernetes自動生成的,所以很多瀏覽器不信任,可以選擇FireFox瀏覽器訪問,按照上圖的方法即可正常訪問:這樣就進入了dashboard的登陸介面。

4.4 通過token令牌訪問dashboard

建立管理員token,具有檢視任何名稱空間的許可權,可以管理所有的資源物件:

kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:kubernetes-dashboard

建立完成之後,檢視kubernetes-dashboard名稱空間下的secrets

# 檢視kubernetes-dashboard名稱空間下的所有secrets
kubectl get secrets -n kubernetes-dashboard

# 檢視token
kubectl describe secret kubernetes-dashboard-token-nq6hm -n kubernetes-dashboard

如下圖,複製token部分的內容,在瀏覽器貼上即可登陸:

也可以使用下面的命令獲取到Token:

kubectl describe secrets $(kubectl get secrets -n kubernetes-dashboard | grep kubernetes-dashboard-token|awk '{print $1}') -n kubernetes-dashboard | awk 'NR==13{print $2}'

回到瀏覽器,選擇通過token登陸,貼上token:點選登陸之後,成功登陸:

4.5 通過Kubeconfig登陸

在dashboard登陸介面, tokenKubeconfig兩種登陸方式。上面已經詳細說明了怎麼通過token登陸,所以這裡說明一下怎麼通過Kubeconfig登陸。

4.5.1 建立cluster叢集

cd /etc/kubernetes/pki/
kubectl config set-cluster kubernetes --certificate-authority=./ca.crt --server="https://192.168.126.8:16443" --embed-certs=true --kubeconfig=/root/dashboard-admin.conf

# 檢視ashboard-admin.conf
cat /root/dashboard-admin.conf

4.5.2 建立credentials

建立credentials需要使用通過token登陸時生成的token資訊。

# 獲取token並賦值給環境變數
DEF_NS_ADMIN=$(kubectl get secret kubernetes-dashboard-token-nq6hm -n kubernetes-dashboard -o jsonpath={.data.token}|base64 -d)

# 檢視環境變數(token)
echo $DEF_NS_ADMIN

# 通過token建立credentials
kubectl config set-credentials dashboard-admin --token=$DEF_NS_ADMIN --kubeconfig=/root/dashboard-admin.conf

# 檢視Kubeconfig檔案dashboard-admin.conf
cat /root/dashboard-admin.conf

4.5.3 建立context

kubectl config set-context dashboard-admin@kubernetes --cluster=kubernetes --user=dashboard-admin --kubeconfig=/root/dashboard-admin.conf

# 檢視Kubeconfig檔案dashboard-admin.conf
cat /root/dashboard-admin.conf

4.5.4 切換當前context為dashboard-admin@kubernetes

kubectl config use-context dashboard-admin@kubernetes --kubeconfig=/root/dashboard-admin.conf

# 檢視Kubeconfig檔案dashboard-admin.conf
cat /root/dashboard-admin.conf

4.5.5 通過Kubeconfig登陸

將生成的dashboard-admin.conf複製到本地,登陸也沒選擇通過Kubeconfig登陸,並選擇dashboard-admin.conf進行登陸:

點選登入後,成功登陸dashboard:

4.6 通過Dashboard建立應用

在dashboard的右上角點選+號,選擇從表單建立

根據表單選項填寫:

點選部署即可完成Pod的建立:

通過Service可以檢視到對應的Service

通過dashboard建立的Service預設是LoadBalance型別,但是在這種情況下,沒有整合 LoadBalancer(與 AWS、Google Cloud、阿里雲等雲廠商不同)。使用此預設設定,你只能使用 NodePortIngress Controller

但是不影響你提供節點IP加埠訪問,或者你也可以直接kubectl edit svc xxx將型別修改為NodePort即可。

通過節點IP:31272訪問:

可以正常訪問,說明Nginx部署成功了。

5、安裝metrics-server元件

5.1 什麼是metrics-server

metrics-server是一個叢集範圍內的資源資料集和工具,同樣的,metrics-server也只是顯示資料,並不提供資料儲存服務,主要關注的是資源度量API的實現,比如CPU、檔案描述符、記憶體、請求延時等指標,metrics-server收集資料給Kubernetes叢集內使用,如kubectlhpascheduler等。

可以通過kubectl top等獲取Kubernetes叢集中資源資訊等。

  • Kubernetes Metrics Server 是 Cluster 的核心監控資料的聚合器,kubeadm 預設是不部署的。
  • Metrics Server 供 Dashboard 等其他元件使用,是一個擴充套件的 APIServer,依賴於 API Aggregator。所以,在安裝 Metrics Server 之前需要先在 kube-apiserver 中開啟 API Aggregator。
  • Metrics API 只可以查詢當前的度量資料,並不儲存歷史資料。
  • Metrics API URI 為 /apis/metrics.k8s.io/,在 k8s.io/metrics 下維護。
  • 必須部署 metrics-server 才能使用該 API,metrics-server 通過呼叫 kubelet Summary API 獲取資料。

GitHub地址:https://github.com/kubernetes-sigs/metrics-server

下載地址:https://github.com/kubernetes-sigs/metrics-server/releases

5.2 安裝條件

注意:使用 Metrics Server 有必備兩個條件:

  1. API Server 啟用 Aggregator Routing 支援。否則 API Server 不識別請求:

    Error from server (ServiceUnavailable): the server is currently unable to handle the request (get pods.metrics.k8s.io)
    
  2. API Server 能訪問 Metrics Server Pod IP。否則 API Server 無法訪問 Metrics Server:

    E1223 07:23:04.330206       1 available_controller.go:420] v1beta1.metrics.k8s.io failed with: failing or missing response from https://192.168.126.8:14443/apis/metrics.k8s.io/v1beta1: Get https://192.168.126.8:14443/apis/metrics.k8s.io/v1beta1: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
    

5.3 修改API Server配置

vim /etc/kubernetes/manifests/kube-apiserver.yaml
# 新增如下一行
- --enable-aggregator-routing=true

修改的內容如下:

注意:這個是k8s在1.17的新特性,如果是1.16版本的可以不用新增,1.17以後要新增。這個引數的作用是Aggregation允許在不修改Kubernetes核心程式碼的同時擴充套件Kubernetes API。

儲存退出之後,需要更新API Server配置才能夠生效:

kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml

kubectl get pods -n kube-system -o wide

將下面圖中狀態為CrashLoopBackOff的Pod刪除:

kubectl delete pod kube-apiserver -n kube-system

刪除之後Kubernetes會自動拉起新的Pod:

5.4 安裝metrics-server

wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml
mv components.yaml metrics.yaml
kubectl apply -f metrics.yaml

kubectl get pods -n kube-system -o wideku

安裝之後:

5.4 測試kubectl top命令

# 檢視kube-system名稱空間中Pod的資源佔用情況
kubectl top pods -n kube-system

kube-system名稱空間Pod資源使用情況:

# 檢視節點資源使用情況
kubectl top nodes

Kubernetes節點資源使用情況:

6、修改schedulercontroller-managerkube-proxy監聽地址

預設schedulercontroller-manager元件監聽埠是在127.0.0.1上的:

後期如果提供Prometheus監控這些元件的時候,無法獲取到127.0.0.1上的資料,所以我們需要將這些埠的監聽地址修改為物理機的網絡卡IP上。

6.1 修改scheduler元件的監聽地址

vim /etc/kubernetes/manifests/kube-scheduler.yaml

需要將下圖中四個部分進行修改:

  • - --bind-address=127.0.0.1修改為實際的主機IP
  • 刪除- --port=0
  • livenessProbehttpGet中的host: 127.0.0.1修改為實際的主機IP
  • startupProbehttpGet中的host: 127.0.0.1修改為實際的主機IP

修改後如下圖所示:

儲存退出後,需要重啟所有節點(所有master節點和worker節點)上的kubelet修改就會生效:

systemctl restart kubelet.service

修改後再次檢視監聽埠:

6.2 修改controller-manager元件監聽地址

vim /etc/kubernetes/manifests/kube-controller-manager.yaml

將下圖中四個部分進行修改:

  • - --bind-address=127.0.0.1修改為實際的主機IP
  • 刪除- --port=0
  • livenessProbehttpGet中的host: 127.0.0.1修改為實際的主機IP
  • startupProbehttpGet中的host: 127.0.0.1修改為實際的主機IP

修改為下圖所示:

儲存退出後,需要重啟所有節點(所有master節點和worker節點)上的kubelet修改就會生效:

systemctl restart kubelet.service

修改後再次檢視監聽埠:

6.3 修改Kube-proxy元件的監聽地址

kubectl edit configmaps -n kube-system kube-proxy

將下圖中對應的metricsBindAddress修改為0.0.0.0:10249

修改之後的內容如下圖所示:

修改完成之後,儲存退出,並且需要重啟kube-proxy對應的Pod:

kubectl get pods -n kube-system | grep kube-proxy |awk '{print $1}' | xargs kubectl delete pods -n kube-system 

重啟完之後檢視監聽地址:

6.4 檢查

netstat -lntp | grep :10249
netstat -lntp | grep :10251
netstat -lntp | grep :10252

最終效果如下:

7、重置節點

# 重置主節點(k8s-master01)
kubeadm reset

rm -rf /root/.kube/
rm -rf /etc/kubernetes/
systemctl restart kubelet.service