[TOC]
一、安裝先決條件和集群規(guī)劃
1.1 環(huán)境配置
以下操作在所有節(jié)點(diǎn)執(zhí)行
- 關(guān)閉防火墻:
systemctl stop firewalld
systemctl disable firewalld
- 禁用SELinux ,讓容器可以讀取主機(jī)文件系統(tǒng):
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
- 校正時(shí)間:
date
- 安裝ntp
yum install -y ntp
- 同步時(shí)間
ntpdate cn.pool.ntp.org
- 關(guān)閉swap K8S中不支持swap分區(qū)
swapoff -a
vim /etc/fstab
#/dev/mapper/centos-swap swap swap defaults 0 0
1.2 集群規(guī)劃
- docker 版本: 19.03.5
- kubelet 版本: V1.16.3
- kubeadm 版本: v1.16.3
| 角色 | 主機(jī)名 | IP 地址 | 配置信息 |
|---|---|---|---|
| Master | k8s-master | 192.168.92.10 | 2核4G內(nèi)存 |
| Node | k8s-slave01 | 192.168.92.11 | 2核4G內(nèi)存 |
| Node | k8s-slave02 | 192.168.92.12 | 2核4G內(nèi)存 |
以下操作在所有節(jié)點(diǎn)執(zhí)行
更改hosts文件添加主機(jī)名與IP映射關(guān)系
vim /etc/hosts
192.168.92.10 k8s-master
192.169.92.11 k8s-slave01
192.168.92.12 k8s-slave02
將橋接的IPV4流量傳遞到iptables的鏈
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0
net.ipv4.ip_forward= 1
EOF
載入配置:
sysctl --system
允許自動(dòng)登錄:
sed -i "s/PasswordAuthentication no/PasswordAuthentication yes/g" /etc/ssh/sshd_config
二、安裝Docker
以下操作在所有節(jié)點(diǎn)執(zhí)行
1.卸載舊版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
2.安裝并運(yùn)行Docker[使用存儲(chǔ)庫(kù)進(jìn)行安裝]
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
3.設(shè)置穩(wěn)定的存儲(chǔ)庫(kù)。
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
4. 安裝docker
sudo yum install docker-ce
sudo systemctl start docker
sudo systemctl enable docker
5.檢查安裝結(jié)果
# docker info
出現(xiàn)如下信息,則docker安裝成功
Kernel Version: 3.10.0-693.17.1.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
Number of Docker Hooks: 3
CPUs: 1
Total Memory: 1.359 GiB
Name: localhost.localdomain
ID: KE6P:FAHI:ZYWT:AUWU:NVFG:6JRF:33ZS:AT4X:63QZ:ICYW:PUTO:V4ZB
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Registries: docker.io (secure)
三、安裝kubeadm工具
以下操作所有節(jié)點(diǎn)進(jìn)行
1.添加kerbernets鏡像文件信息
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
2.安裝kubeadm工具
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
2.設(shè)置開機(jī)自啟動(dòng)
systemctl enable kubelet && systemctl start kubelet
3.查看kubeadm、kubelet版本
kubelet --version
kubeadm version
三、安裝master節(jié)點(diǎn)
以下步驟在主節(jié)點(diǎn)進(jìn)行
1.初始化配置安裝參數(shù)
kubeadm config print init-defaults > init.default.yaml
初始化結(jié)果如下:
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 1.2.3.4
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: localhost.localdomain
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.16.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
scheduler: {}
2.下載kubernetes相關(guān)鏡像
添加docker鏡像倉(cāng)庫(kù)信息:
echo '{"registry-mirrors":["https://registry.docker-cn.com"]}' > /etc/docker/daemon.json
cat /etc/docker/daemon.json
重啟docker容器
systemctl restart docker
修改初始化打印文件名為:init-config.yaml
mv init-default.yaml intit-config.yaml
修改init-config.yaml 文件,修改鏡像地址信息:
imageRepository: registry.aliyuncs.com/google_containers
刪除無(wú)用信息,最終配置文件如下,如多配置,會(huì)導(dǎo)致Master節(jié)點(diǎn)安裝失?。?/p>
apiVersion: kubeadm.k8s.io/v1beta2
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.16.0
networking:
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16
根據(jù)初始化的參數(shù)文件進(jìn)行相關(guān)鏡像下載:
kubeadm config images pull --config=init-config.yaml
根據(jù)下載的鏡像安裝Master
kubeeadm init --config=init-config.yaml
安裝成功后會(huì)有如下類似提示:
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
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/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.92.10:6443 --token 4nmcwj.ebrnxqyks0rmkgki \
--discovery-token-ca-cert-hash sha256:3d246361bc34b33cd7c60eb6a19e74a13842a4a810128b890c0f06c23065a28a
按提示操作:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
此時(shí)查看雁陣kubeadm-config 的ConfigMap對(duì)象:
kubectl get -n kube-system configmap
查看安裝狀態(tài):
[root@k8s-master k8s]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady master 17m v1.16.3
四、安裝CNI網(wǎng)絡(luò)通信插件
1.安裝CNI插件
此處采用kube-flannel
mkdir flannel && cd flannel
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubekubectl apply -f kube-flannel.yml
flannel支持的模式:
flannel支持多種模型
VxLAN #vxLAN有以下兩種模式
(1) vxlan #疊加網(wǎng)絡(luò)或者隧道網(wǎng)絡(luò),通過(guò)封裝網(wǎng)絡(luò)報(bào)文的方式使不同網(wǎng)段的pod之間可以通訊
(2) Directrouting #直接使用主機(jī)的IP地作為網(wǎng)關(guān),通過(guò)主機(jī)路由的方式與目標(biāo)pod進(jìn)行通訊,當(dāng)目標(biāo)pod與當(dāng)前pod不在同一三層網(wǎng)絡(luò)內(nèi),會(huì)自動(dòng)降級(jí)為VxLAN模式
host-gw: Host GateWay #與VxLAN的Directrouting模式相同,當(dāng)目標(biāo)pod與當(dāng)前pod不在同一三層網(wǎng)絡(luò)內(nèi)時(shí),pod之間無(wú)法通訊
UDP: #早期由于Linux內(nèi)核不支持VxLAN,host-gw又有非常高的入門門檻,udp是flannel最早期使用的模式,由于使用普通的udp報(bào)文通訊,性能非常差,在可以使用前面兩種模式的情況下請(qǐng)勿使用該模式
如安裝不成功,手動(dòng)下載鏡像并修改鏡像名為yml鏡像名:
docker pull quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64
docker tag quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.10.0-amd64
查看集群狀態(tài):
[root@k8s-master flannel]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 5m43s v1.16.3
TIPS:
- 如果master安裝失敗,執(zhí)行
kubeadm reset #重置主機(jī),之后重新執(zhí)行kubeadm init再次安裝
- 如果 Pod 錯(cuò)誤,需要執(zhí)行如下命令查看Pod錯(cuò)誤信息
kubectl --namespace=kube-system describe pod <pod_name>
五、node節(jié)點(diǎn)加入集群
先決條件: 已經(jīng)安裝kubelet kubeadm
1.創(chuàng)建節(jié)點(diǎn)加入配置文件 join-config.yaml
vim /home/k8s/join-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: JoinConfiguration
discovery:
bootstrapToken:
apiServerEndpoint: 192.168.92.10:6443
token: 4nmcwj.ebrnxqyks0rmkgki
unsafeSkipCAVerification: true
tlsBootstrapToken: 4nmcwj.ebrnxqyks0rmkgki
其中 token 和 tlsBootstrapToken 來(lái)自Master安裝后的提示末尾信息, 如果忘記了token信息和證書信息可使用以下命令查詢:
- 查詢token信息
kubeadm token list
token 24小時(shí)失效
可使用如下命令重新創(chuàng)建
kubeadm token create
- 查詢ca證書hash值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
2.node節(jié)點(diǎn)加入集群
以下操作適用于node1和node2
kubeadm join --config=join-config.yaml
節(jié)點(diǎn)加入成功會(huì)有如下信息:
[preflight] Running pre-flight checks
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 19.03.5. Latest validated version: 18.09
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.16" ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Activating the kubelet service
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
如果節(jié)點(diǎn)加入超時(shí),請(qǐng)執(zhí)行如下命令:
swapoff -a
kubeadm reset
systemctl daemon-reload
systemctl restart kubelet
并手動(dòng)在node節(jié)點(diǎn)下載flannel鏡像:
docker pull quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64
docker tag quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.10.0-amd64
剔除節(jié)點(diǎn)并重新加入
節(jié)點(diǎn)剔除:
【master執(zhí)行】
kubectl drain k8s-slave2 --delete-local-data --ignore-daemonsets
kubectl delete node k8s-slave2
node退出節(jié)點(diǎn)執(zhí)行:
kubeadm reset
六、常用命令:
1.查看所加入節(jié)點(diǎn)
[root@k8s-master kubernetes]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 101m v1.16.3
k8s-slave1 Ready <none> 41s v1.16.3
k8s-slave2 Ready <none> 11m v1.16.3
2.查看所有Pod命令
kubectl get pod --all-namespaces
七、安裝k8s dashboard
- dashboard版本:V2.0.0.0-beta8
- metrics Scaraper版本: v1.0.1
1.下載yaml文件
https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
如果無(wú)法下載請(qǐng)下載離線安裝yaml文件,由于文件和鏡像被墻,請(qǐng)采用筆者分享的最新的鏡像版本手動(dòng)下載后導(dǎo)入鏡像
2.下載dashboard鏡像
由于dashboard鏡像無(wú)法在國(guó)內(nèi)下載,需要手動(dòng)下載鏡像到node1和node2,請(qǐng)手動(dòng)導(dǎo)入鏡像到node1和node2到docker鏡像中
- 導(dǎo)入鏡像命令:
docker load< dashboard-2.0.0-beata.tar
docker load< metrics-scraper-1.0.0.1.tar
- 修改導(dǎo)入的鏡像名稱
docker tag xxxx kubernetesui/dashboard:v2.0.0-beta8 ## xxx為你剛才導(dǎo)入的鏡像ID
docker tag xxxx kubernetesui/metrics-scraper:v1.0.1
3.安裝dashboard
環(huán)境準(zhǔn)備工作做好后,檢查下節(jié)點(diǎn)狀態(tài)OK后進(jìn)行dashboard安裝,以上操作如果你可以直接下載資源,可不用手動(dòng)下載配置文件和鏡像資源,直接開始安裝
- 安裝dashboard [主節(jié)點(diǎn)進(jìn)行]
kubectl apply -f recommended.yaml
等待安裝完成,值的說(shuō)明的是,需要?jiǎng)?chuàng)建一個(gè)管理員賬號(hào)和角色方可登錄dashboard系統(tǒng),因此創(chuàng)建角色和賬號(hào),新的dashboard采用了新的命名空間,與kube-system命名空間進(jìn)行了分離,需要注意此處內(nèi)容
- 查看dashboard-adminuser.yaml,注意nameSpace
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
執(zhí)行角色創(chuàng)建
kubectl apply -f dashboard-adminuser.yaml
查看密鑰創(chuàng)建信息
kubectl get secret -n kubernetes-dashboard
用戶和角色創(chuàng)建后,我們需要?jiǎng)?chuàng)建https證書便于瀏覽器查看系統(tǒng)
- 生成client-certificate-data
grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt
- 生成client-key-data
grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key
- 生成p12,不要隨便輸入,要用此密碼在瀏覽器導(dǎo)入證書
openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"
生成后將有以下文件信息:
將kubecfg.p12文件下載到電腦卓明,點(diǎn)擊chrome瀏覽器設(shè)置,點(diǎn)擊高級(jí),點(diǎn)擊證書管理,
點(diǎn)擊導(dǎo)入

選擇文件,輸入剛才生成證書的密碼,候選選擇默認(rèn),最終會(huì)提示完成,點(diǎn)擊退出,重啟瀏覽器

完成后我們需要看下dashboard 的pod是否正常,查看一下所有pod信息
[root@k8s-master dashboard]# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-58cc8c89f4-8tfwv 1/1 Running 3 4h14m
kube-system coredns-58cc8c89f4-tnt4l 1/1 Running 4 4h14m
kube-system etcd-k8s-master 1/1 Running 4 4h13m
kube-system kube-apiserver-k8s-master 1/1 Running 4 4h13m
kube-system kube-controller-manager-k8s-master 1/1 Running 5 4h13m
kube-system kube-flannel-ds-amd64-5ddlb 1/1 Running 5 4h9m
kube-system kube-flannel-ds-amd64-svdt4 1/1 Running 2 4h5m
kube-system kube-flannel-ds-amd64-wcd9f 1/1 Running 2 4h3m
kube-system kube-proxy-cq724 1/1 Running 1 4h5m
kube-system kube-proxy-l52m7 1/1 Running 3 4h14m
kube-system kube-proxy-zzs5c 1/1 Running 1 4h3m
kube-system kube-scheduler-k8s-master 1/1 Running 4 4h13m
kubernetes-dashboard dashboard-metrics-scraper-76585494d8-txftz 1/1 Running 2 3h11m
kubernetes-dashboard kubernetes-dashboard-7bb44758b6-kbgqs 1/1 Running 1 3h11m
可以清楚的看到,dashboard是在Runing狀態(tài),且在kubernetes-dashboard命名空間內(nèi),然后查看一下具體的運(yùn)行狀態(tài)細(xì)信息
kubectl describe -n kubernetes-dashboard pod kubernetes-dashboard-7bb44758b6-kbgqs
如果提示啟動(dòng)容器成功等消息,證明我們的dashboard是沒(méi)有問(wèn)題的
- 查看代理節(jié)點(diǎn)信息
[root@k8s-master dashboard]# kubectl cluster-info
Kubernetes master is running at https://192.168.92.10:6443
KubeDNS is running at https://192.168.92.10:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump
4.訪問(wèn)dashboard
瀏覽器輸入代理地址信息:
https://192.168.92.10:6443/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
上述IP為你Master節(jié)點(diǎn)的信息,端口來(lái)源于代理節(jié)點(diǎn)信息查詢結(jié)果,請(qǐng)根據(jù)自己部署的IP進(jìn)行查看系統(tǒng)。
輸入后首先需要確認(rèn)證書,點(diǎn)擊同意,之后打開了登錄界面,選擇 token
- master節(jié)點(diǎn)查詢tokne
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin | awk '{print $1}')
以上命令注意查詢的命名空間,避免查錯(cuò)管理員token而導(dǎo)致進(jìn)入后提示部分模塊無(wú)法查詢,缺少權(quán)限等。
輸入token后就可以看到k8s dashboard面板了

5.安裝失敗后的一些處理方法
如果安裝失敗可以刪除dashboard和角色重新安裝
- 刪除dashboard
kubectl delete -f recommended.yaml
- 刪除角色信息
kubelct delete -f dashboard-adminuser.yaml
本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布!
