1. 程式人生 > 其它 >51微控制器非阻塞串列埠中斷收發資料

51微控制器非阻塞串列埠中斷收發資料

通過kubeadm部署kubernetes

kubernetes介紹

kubernetes是一個可移植的、可擴充套件的開源平臺,用於容器化的工作負載和服務,可促進宣告式配置和自動化。 Kubernetes 擁有一個龐大且快速增長的生態系統。Kubernetes 的服務、支援和工具廣泛可用。

Kubernetes 這個名字源於希臘語,意為“舵手”或“飛行員”。k8s 這個縮寫是因為 k 和 s 之間有八個字元的關係。 Google 在 2014 年開源了 Kubernetes 專案。Kubernetes 建立在 Google 在大規模執行生產工作負載方面擁有十幾年的經驗 的基礎上,結合了社群中最好的想法和實踐

傳統部署時代:

早期,各個組織機構在物理伺服器上執行應用程式。無法為物理伺服器中的應用程式定義資源邊界,這會導致資源分配問題。 例如,如果在物理伺服器上執行多個應用程式,則可能會出現一個應用程式佔用大部分資源的情況, 結果可能導致其他應用程式的效能下降。 一種解決方案是在不同的物理伺服器上執行每個應用程式,但是由於資源利用不足而無法擴充套件, 並且維護許多物理伺服器的成本很高。

虛擬化部署時代:

作為解決方案,引入了虛擬化。虛擬化技術允許你在單個物理伺服器的 CPU 上執行多個虛擬機器(VM)。 虛擬化允許應用程式在 VM 之間隔離,並提供一定程度的安全,因為一個應用程式的資訊 不能被另一應用程式隨意訪問。

虛擬化技術能夠更好地利用物理伺服器上的資源,並且因為可輕鬆地新增或更新應用程式 而可以實現更好的可伸縮性,降低硬體成本等等。

每個 VM 是一臺完整的計算機,在虛擬化硬體之上執行所有元件,包括其自己的作業系統。

容器部署時代:

容器類似於 VM,但是它們具有被放寬的隔離屬性,可以在應用程式之間共享作業系統(OS)。 因此,容器被認為是輕量級的。容器與 VM 類似,具有自己的檔案系統、CPU、記憶體、程序空間等。 由於它們與基礎架構分離,因此可以跨雲和 OS 發行版本進行移植。

容器因具有許多優勢而變得流行起來。下面列出的是容器的一些好處:

  • 敏捷應用程式的建立和部署:與使用 VM 映象相比,提高了容器映象建立的簡便性和效率。
  • 持續開發、整合和部署:通過快速簡單的回滾(由於映象不可變性),支援可靠且頻繁的 容器映象構建和部署。
  • 關注開發與運維的分離:在構建/釋出時而不是在部署時建立應用程式容器映象, 從而將應用程式與基礎架構分離。
  • 可觀察性:不僅可以顯示作業系統級別的資訊和指標,還可以顯示應用程式的執行狀況和其他指標訊號。
  • 跨開發、測試和生產的環境一致性:在行動式計算機上與在雲中相同地執行。
  • 跨雲和作業系統發行版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、 Google Kubernetes Engine 和其他任何地方執行。
  • 以應用程式為中心的管理:提高抽象級別,從在虛擬硬體上執行 OS 到使用邏輯資源在 OS 上執行應用程式。
  • 鬆散耦合、分散式、彈性、解放的微服務:應用程式被分解成較小的獨立部分, 並且可以動態部署和管理 - 而不是在一臺大型單機上整體執行。
  • 資源隔離:可預測的應用程式效能。
  • 資源利用:高效率和高密度。

Kubernetes的作用

  • 服務發現和負載均衡

    Kubernetes 可以使用 DNS 名稱或自己的 IP 地址公開容器,如果進入容器的流量很大, Kubernetes 可以負載均衡並分配網路流量,從而使部署穩定。

  • 儲存編排

    Kubernetes 允許你自動掛載你選擇的儲存系統,例如本地儲存、公共雲提供商等。

  • 自動部署和回滾

    你可以使用 Kubernetes 描述已部署容器的所需狀態,它可以以受控的速率將實際狀態 更改為期望狀態。例如,你可以自動化 Kubernetes 來為你的部署建立新容器, 刪除現有容器並將它們的所有資源用於新容器。

  • 自動完成裝箱計算

    Kubernetes 允許你指定每個容器所需 CPU 和記憶體(RAM)。 當容器指定了資源請求時,Kubernetes 可以做出更好的決策來管理容器的資源。

  • 自我修復

    Kubernetes 重新啟動失敗的容器、替換容器、殺死不響應使用者定義的 執行狀況檢查的容器,並且在準備好服務之前不將其通告給客戶端。

  • 金鑰與配置管理

k8s元件

  • kube-apiserver: kube-apiserver用於暴露Kubernetes API。任何的資源請求/呼叫操作都是通過kube-apiserver提供的介面進行
  • ETCD:etcd是Kubernetes提供預設的儲存系統,儲存所有叢集資料,使用時需要為etcd資料提供備份計劃。
  • controller-manager: kube-controller-manager執行管理控制器,它們是叢集中處理常規任務的後臺執行緒。邏輯上,每個控制器是一個單獨的程序,但為了降低複雜性,它們都被編譯成單個二進位制檔案,並在單個程序中執行。包括:節點控制器、副本控制器、端點控制器、serverAccount
  • kube-scheduler:實現服務排程資源分配到相應節點的pod,為pod選擇一個Node
  • DNS外掛:為叢集內部svc提供DNS記錄
  • kubelet:主要的節點代理,實現對pod的日產管理與操作
  • kube-proxy:通過在主機上維護網路規則並執行連線轉發來實現kuberneters服務抽象

基礎環境準備

機器 IP
master01 192.168.0.71
master02 192.168.0.72
master03 192.168.0.73
node01 192.168.0.74
node02 192.168.0.75

五臺機器共同配置

配置k8s自動補全

yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

配置docker、k8s yum源

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
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=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

cd /root/ ; git clone https://github.com/dotbalo/k8s-ha-install.git

配置本地hosts劫持*

[root@k8s-master01 ~]# cat /etc/hosts
192.168.0.72 k8s-master01
192.168.0.71 k8s-master02
192.168.0.73 k8s-master03
192.168.1.100 k8s-master-lb
192.168.0.74 k8s-node01
192.168.0.75 k8s-node02

配置關閉防火牆及selinux、swap

1.防火牆略
2.selinux略
3.swapoff -a && sysctl -w vm.swappiness=0

所有節點配置時間同步

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' >/etc/timezone
ntpdate time2.aliyun.com
# 加入到crontab
*/5 * * * * ntpdate time2.aliyun.com &>/dev/null
# 加入到開機自動同步,/etc/rc.local
ntpdate time2.aliyun.com

叢集配置金鑰對

ssh-keygen -t rsa
for i in k8s-master-01 k8s-master-02 k8s-master03 k8s-node01 k8s-node02;do ssh-copy-id -i .ssh/id_rsa.pub $i;done

安裝必要軟體並升級系統

yum install wget jq psmisc vim net-tools telnet -y
yum update -y --exclude=kernel* && reboot #CentOS7需要升級,8不需要

核心升級配置

CentOS7 需要升級核心至4.18+,本地升級的版本為4.19

在master01節點下載核心

cd /root
wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm
wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm

從master01節點傳到其他節點:

for i in k8s-master02 k8s-master03 k8s-node01 k8s-node02;do scp kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm $i:/root/ ; done
# 所有節點安裝核心
cd /root && yum localinstall -y kernel-ml*
# 所有節點更改核心啟動順序
grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
# 檢查預設核心是不是4.19
[root@k8s-master02 ~]# grubby --default-kernel
/boot/vmlinuz-4.19.12-1.el7.elrepo.x86_64
# 所有節點重啟,然後檢查核心是不是4.19
[root@k8s-master02 ~]# uname -a
Linux k8s-master02 4.19.12-1.el7.elrepo.x86_64 #1 SMP Fri Dec 21 11:06:36 EST 2018 x86_64 x86_64 x86_64 GNU/Linux

所有節點安裝ipvsadm

yum install ipvsadm ipset sysstat conntrack libseccomp -y

所有節點配置ipvs模組,在核心4.19+版本nf_conntrack_ipv4已經改為nf_conntrack, 4.18以下使用nf_conntrack_ipv4即可:

modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack

vim /etc/modules-load.d/ipvs.conf
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_sh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
然後執行systemctl enable --now systemd-modules-load.service即可

開啟一些k8s叢集中必須的核心引數

cat <<EOF > /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
EOF
sysctl --system

所有節點配置完核心後,重啟伺服器,保證重啟後核心載入

k8s基礎元件安裝

# 所有節點安裝Docker-ce 19.03
yum install docker-ce-19.03.* docker-cli-19.03.* -y

# 溫馨提示:
# 由於新版kubelet建議使用systemd,所以可以把docker的CgroupDriver改成systemd
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
 "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

# 所有節點設定開機自啟動Docker:
systemctl daemon-reload && systemctl enable --now docker

# 安裝k8s元件:
yum list kubeadm.x86_64 --showduplicates | sort -r

# 所有節點安裝最新版本kubeadm:
yum install kubeadm-1.20* kubelet-1.20* kubectl-1.20* -y

# 預設配置的pause映象使用gcr.io倉庫,國內可能無法訪問,所以這裡配置Kubelet使用阿里雲的pause映象:
cat >/etc/sysconfig/kubelet<<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2"
EOF

# 設定Kubelet開機自啟動:
systemctl daemon-reload
systemctl enable --now kubelet

kubeadm搭建故障問題

1. 新增刪除節點證書問題
1) 所需要被新增的節點,通過kubeadm reset 清空k8s環境
2) 清空cni外掛配置目錄
3) 清空iptables 規則
4) master節點,通過檢視新增證書命令,執行新增節點操作
   kubeadm token create --print-join-command

2. 如何重新生成證書
kubeadm init phase upload-certs --upload-certs

檢視證書過期時間

kubeadm alpha certs check-expiration

安裝高可用元件

(注意:如果不是高可用叢集,haproxy和keepalived無需安裝)

公有云要用公有云自帶的負載均衡,比如阿里雲的SLB,騰訊雲的ELB,用來替代haproxy和keepalived,因為公有云大部分都是不支援keepalived的,另外如果用阿里雲的話,kubectl控制端不能放在master節點,推薦使用騰訊雲,因為阿里雲的slb有迴環的問題,也就是slb代理的伺服器不能反向訪問SLB,但是騰訊雲修復了這個問題。

# 所有Master節點通過yum安裝HAProxy和KeepAlived:
yum install keepalived haproxy -y
# 所有Master節點配置HAProxy(詳細配置參考HAProxy文件,所有Master節點的HAProxy配置相同):
[root@k8s-master01 etc]# mkdir /etc/haproxy
[root@k8s-master01 etc]# vim /etc/haproxy/haproxy.cfg 
global
  maxconn  2000
  ulimit-n  16384
  log  127.0.0.1 local0 err
  stats timeout 30s

defaults
  log global
  mode  http
  option  httplog
  timeout connect 5000
  timeout client  50000
  timeout server  50000
  timeout http-request 15s
  timeout http-keep-alive 15s

frontend monitor-in
  bind *:33305
  mode http
  option httplog
  monitor-uri /monitor

frontend k8s-master
  bind 0.0.0.0:16443
  bind 127.0.0.1:16443
  mode tcp
  option tcplog
  tcp-request inspect-delay 5s
  default_backend k8s-master

backend k8s-master
  mode tcp
  option tcplog
  option tcp-check
  balance roundrobin
  default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
  server k8s-master01	192.168.0.71:6443  check
  server k8s-master02	192.168.0.72:6443  check
  server k8s-master03	192.168.0.73:6443  check
  
# 所有Master節點配置KeepAlived,配置不一樣,注意區分 
[root@k8s-master01 pki]# vim /etc/keepalived/keepalived.conf 
注意每個節點的IP和網絡卡(interface引數)
Master01節點的配置:
[root@k8s-master01 etc]# mkdir /etc/keepalived

[root@k8s-master01 ~]# vim /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
global_defs {
    router_id LVS_DEVEL
script_user root
    enable_script_security
}
vrrp_script chk_apiserver {
    script "/etc/keepalived/check_apiserver.sh"
    interval 5
    weight -5
    fall 2  
rise 1
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    mcast_src_ip 192.168.0.71
    virtual_router_id 51
    priority 101
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass K8SHA_KA_AUTH
    }
    virtual_ipaddress {
        192.168.0.236
    }
    track_script {
       chk_apiserver
    }
}
Master02節點的配置:
! Configuration File for keepalived
global_defs {
    router_id LVS_DEVEL
script_user root
    enable_script_security
}
vrrp_script chk_apiserver {
    script "/etc/keepalived/check_apiserver.sh"
   interval 5
    weight -5
    fall 2  
rise 1
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    mcast_src_ip 192.168.0.72
    virtual_router_id 51
    priority 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass K8SHA_KA_AUTH
    }
    virtual_ipaddress {
        192.168.0.236
    }
    track_script {
       chk_apiserver
    }
}
Master03節點的配置:
! Configuration File for keepalived
global_defs {
    router_id LVS_DEVEL
script_user root
    enable_script_security
}
vrrp_script chk_apiserver {
    script "/etc/keepalived/check_apiserver.sh"
 interval 5
    weight -5
    fall 2  
rise 1
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    mcast_src_ip 192.168.0.73
    virtual_router_id 51
    priority 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass K8SHA_KA_AUTH
    }
    virtual_ipaddress {
        192.168.0.236
    }
    track_script {
       chk_apiserver
    }
}
所有master節點配置KeepAlived健康檢查檔案:
[root@k8s-master01 keepalived]# cat /etc/keepalived/check_apiserver.sh 
#!/bin/bash

err=0
for k in $(seq 1 3)
do
    check_code=$(pgrep haproxy)
    if [[ $check_code == "" ]]; then
        err=$(expr $err + 1)
        sleep 1
        continue
    else
        err=0
        break
    fi
done

if [[ $err != "0" ]]; then
    echo "systemctl stop keepalived"
    /usr/bin/systemctl stop keepalived
    exit 1
else
    exit 0
fi


chmod +x /etc/keepalived/check_apiserver.sh
啟動haproxy和keepalived
 systemctl daemon-reload
 systemctl enable --now haproxy
 systemctl enable --now keepalived

kubeadm叢集初始化

#Master01節點建立kubeadm-config.yaml配置檔案如下:
Master01:(# 注意,如果不是高可用叢集,192.168.0.236:16443改為master01的地址,16443改為apiserver的埠,預設是6443,注意更改v1.18.5自己伺服器kubeadm的版本:kubeadm version)

##注意
# 以下檔案內容,宿主機網段、podSubnet網段、serviceSubnet網段不能重複,具體看課程資料的【安裝前必看】叢集安裝網段劃分
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: 7t2weq.bjbawausm0jaxury
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.0.71
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: k8s-master01
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  certSANs:
  - 192.168.0.236
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 192.168.0.236:16443
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.20.0
networking:
  dnsDomain: cluster.local
  podSubnet: 172.16.0.0/12
  serviceSubnet: 10.96.0.0/12
scheduler: {}

更新kubeadm檔案
kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml


#將new.yaml檔案複製到其他master節點,之後所有Master節點提前下載映象,可以節省初始化時間:
kubeadm config images pull --config /root/new.yaml 

#所有節點設定開機自啟動kubelet
systemctl enable --now kubelet(如果啟動失敗無需管理,初始化成功以後即可啟動)

#Master01節點初始化,初始化以後會在/etc/kubernetes目錄下生成對應的證書和配置檔案,之後其他Master節#點加入Master01即可:
kubeadm init --config /root/new.yaml  --upload-certs

#如果初始化失敗,重置後再次初始化,命令如下:
kubeadm reset -f ; ipvsadm --clear  ; rm -rf ~/.kube
#初始化成功以後,會產生Token值,用於其他節點加入時使用,因此要記錄下初始化成功生成的token值(令牌值):
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 the control-plane node running the following command on each as root:

  kubeadm join 192.168.0.236:16443 --token 7t2weq.bjbawausm0jaxury \
    --discovery-token-ca-cert-hash sha256:8c92ecb336be2b9372851a9af2c7ca1f7f60c12c68f6ffe1eb513791a1b8a908 \
    --control-plane --certificate-key ac2854de93aaabdf6dc440322d4846fc230b290c818c32d6ea2e500fc930b0aa

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.0.236:16443 --token 7t2weq.bjbawausm0jaxury \
    --discovery-token-ca-cert-hash sha256:8c92ecb336be2b9372851a9af2c7ca1f7f60c12c68f6ffe1eb513791a1b8a908

# Master01節點配置環境變數,用於訪問Kubernetes叢集:
cat <<EOF >> /root/.bashrc
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF
source /root/.bashrc

#所有節點設定開機自啟動kubelet
systemctl enable --now kubelet(如果啟動失敗無需管理,初始化成功以後即可啟動)

# 檢視節點狀態:
 [root@k8s-master01 ~]# kubectl get nodes
NAME           STATUS     ROLES                  AGE   VERSION
k8s-master01   NotReady   control-plane,master   74s   v1.20.0
採用初始化安裝方式,所有的系統元件均以容器的方式執行並且在kube-system名稱空間內,此時可以檢視Pod狀態:

叢集擴容新增新節點

若token過期需,先生成新的token及證書

kubeadm token create --print-join-command
kubeadm init phase upload-certs  --upload-certs

擴容計算節點需要同時制定token與證書,擴容

kubeadm join 192.168.0.236:16443 --token s5jvof.yzdwwx1qiljteygg     --discovery-token-ca-cert-hash sha256:94e36738492df5e652fd1d1c0967accfab62e7ae682342e60f467854de8aa1b0 --control-plane --certificate-key7b1d1b14cccba42df1e6caad6f050e41e8d817626917e86f3c5e6a1d1ab9c738

安裝Calico元件

修改calico-etcd.yaml配置檔案

sed -i 's#etcd_endpoints: "http://<ETCD_IP>:<ETCD_PORT>"#etcd_endpoints: "https://192.168.0.71:2379,https://192.168.0.72:2379,https://192.168.0.73:2379"#g' calico-etcd.yaml
ETCD_CA=`cat /etc/kubernetes/pki/etcd/ca.crt | base64 | tr -d '\n'`
ETCD_CERT=`cat /etc/kubernetes/pki/etcd/server.crt | base64 | tr -d '\n'`
ETCD_KEY=`cat /etc/kubernetes/pki/etcd/server.key | base64 | tr -d '\n'`
sed -i "s@# etcd-key: null@etcd-key: ${ETCD_KEY}@g; s@# etcd-cert: null@etcd-cert: ${ETCD_CERT}@g; s@# etcd-ca: null@etcd-ca: ${ETCD_CA}@g" calico-etcd.yaml


sed -i 's#etcd_ca: ""#etcd_ca: "/calico-secrets/etcd-ca"#g; s#etcd_cert: ""#etcd_cert: "/calico-secrets/etcd-cert"#g; s#etcd_key: "" #etcd_key: "/calico-secrets/etcd-key" #g' calico-etcd.yaml

POD_SUBNET=`cat /etc/kubernetes/manifests/kube-controller-manager.yaml | grep cluster-cidr= | awk -F= '{print $NF}'`

kubectl apply -f calico-etcd.yaml

部署mertics及dashboard

將Master01節點的front-proxy-ca.crt複製到所有Node節點
scp /etc/kubernetes/pki/front-proxy-ca.crt k8s-node01:/etc/kubernetes/pki/front-proxy-ca.crt
scp /etc/kubernetes/pki/front-proxy-ca.crt k8s-node(其他節點自行拷貝):/etc/kubernetes/pki/front-proxy-ca.crt

安裝metrics server
cd /root/k8s-ha-install/metrics-server-0.4.x-kubeadm/

[root@k8s-master01 metrics-server-0.4.x-kubeadm]# kubectl  create -f comp.yaml 
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created


檢視狀態
[root@k8s-master01 metrics-server-0.4.x-kubeadm]# kubectl  top node
NAME           CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
k8s-master01   109m         2%     1296Mi          33%       
k8s-master02   99m          2%     1124Mi          29%       
k8s-master03   104m         2%     1082Mi          28%       
k8s-node01     55m          1%     761Mi           19%       
k8s-node02     53m          1%     663Mi           17%

部署dashboard

cd /root/k8s-ha-install/dashboard/

[root@k8s-master01 dashboard]# kubectl  create -f .
serviceaccount/admin-user created
clusterrolebinding.rbac.authorization.k8s.io/admin-user created
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created

更改dashboard的svc為NodePort:

kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

將ClusterIP更改為NodePort(如果已經為NodePort忽略此步驟):

檢視埠號:

kubectl get svc kubernetes-dashboard -n kubernetes-dashboard

根據自己的例項埠號,通過任意安裝了kube-proxy的宿主機或者VIP的IP+埠即可訪問到dashboard:

訪問Dashboard:https://192.168.0.236:18282(請更改18282為自己的埠),選擇登入方式為令牌(即token方式),參考圖1-2

檢視token登入即可

一些必須的配置更改
將Kube-proxy改為ipvs模式,因為在初始化叢集的時候註釋了ipvs配置,所以需要自行修改一下:
在master01節點執行
kubectl edit cm kube-proxy -n kube-system
mode: “ipvs”
更新Kube-Proxy的Pod:
kubectl patch daemonset kube-proxy -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}" -n kube-system
驗證Kube-Proxy模式
[root@k8s-master01 1.1.1]# curl 127.0.0.1:10249/proxyMode
ipvs