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登陸介面, token
和Kubeconfig
兩種登陸方式。上面已經詳細說明了怎麼通過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、阿里雲等雲廠商不同)。使用此預設設定,你只能使用NodePort
或Ingress Controller
。但是不影響你提供節點IP加埠訪問,或者你也可以直接
kubectl edit svc xxx
將型別修改為NodePort
即可。
通過節點IP:31272訪問:
可以正常訪問,說明Nginx部署成功了。
5、安裝metrics-server元件
metrics-server
5.1 什麼是metrics-server
是一個叢集範圍內的資源資料集和工具,同樣的,metrics-server
也只是顯示資料,並不提供資料儲存服務,主要關注的是資源度量API的實現,比如CPU、檔案描述符、記憶體、請求延時等指標,metrics-server
收集資料給Kubernetes叢集內使用,如kubectl
,hpa
,scheduler
等。
可以通過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 有必備兩個條件:
-
API Server 啟用 Aggregator Routing 支援。否則 API Server 不識別請求:
Error from server (ServiceUnavailable): the server is currently unable to handle the request (get pods.metrics.k8s.io)
-
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節點資源使用情況:
scheduler
、controller-manager
和kube-proxy
監聽地址
6、修改預設scheduler
、controller-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
- 將
livenessProbe
下httpGet
中的host: 127.0.0.1
修改為實際的主機IP - 將
startupProbe
下httpGet
中的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
- 將
livenessProbe
下httpGet
中的host: 127.0.0.1
修改為實際的主機IP - 將
startupProbe
下httpGet
中的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