目前基於容器管理的Kubernetes 已經佔住了80%的市場份額,基本上以成為該領域的標準,由於國內網絡環境的影響,讓kubernetes搭建成了一道技術難題,下面就一步一步教大家如何去搭建kubernetes集群,本文所有的組件均採用的是最新版。
一、kubeadm 介紹
Kubernetes 是 Google 開源的基於 Docker 的容器集群管理系統,通過 yaml 語言寫的配置文件,簡單快速的就能自動部署好應用環境,支持應用橫向擴展,並且可以組織、編排、管理和遷移這些容器化的應用。Kubeadm 是一個可以快速幫助我們創建穩定集群服務的工具,通過它,我們可以在虛擬機、實體機或者雲端快速部署一個高可用的集群服務。
二、環境、軟件準備
安裝之前,先介紹下 Kubeadm 安裝 kubernetes 需要的一些基本硬件要求。
系統要求,支持的系統 Ubuntu 16.04+、 CentOS 7 、HypriotOS v1.0.1+
內存要求,每臺機器至少要有 1GB 內存,否則集群啟動後,留給運行的應用可用內存就很少了。
網絡要求,保證集群內所有機器之前的網絡是可以互相連通的。
本次演示我準備了兩臺系統為 CentOS Linux 7 (Core) 的虛擬機,一臺作為 Master,一臺作為 Node,默認 Master 機器不參與 Pod 調度。集群機器信息如下:
三、初始化工作
1、安裝 ebtables ethtool,否則後邊執行 kubeadm init 的時候會報錯。
yum install ebtables ethtool
2、修改網絡開啟橋接網絡支持,只針對(RHEL/CentOS 7)系統。
vim /usr/lib/sysctl.d/00-system.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
3、關閉 SELinux,目的為了允許容器能夠與本機文件系統交互。
$ setenforce 0
$ systemctl daemon-reload
4、修改節點的 hostname,因為 kubernetes 是根據 hostname 來標示各節點的。
# Master 節點
$ echo "master.localdomain" > /etc/hostname
$ echo "10.236.65.125 master.localdomain" >> /etc/hosts
$ sysctl kernel.hostname=master.localdomain # 不重啟情況下使內核修改生效
5、關閉swapoff
swapoff -a
四、軟件安裝配置
我們知道 kubernetes 環境底層是依賴 Docker 的,所以這裡軟件安裝包括了 Docker 安裝, kubelet、kubeadm、kubectl 組件安裝,以及一些初始化配置工作。
Master 和 Node 節點由於分工不一樣,所以安裝的服務不同,最終安裝完畢,Master 和 Node 啟動的核心服務分別如下:
五、鏡像準備
針對國內鏡像環境,我指定了一個腳本,執行該腳本即可,pull 不下來多執行幾次就好了
#!/bin/bash
images=(kube-proxy-amd64:v1.10.1 kube-scheduler-amd64:v1.10.1 kube-controller-manager-amd64:v1.10.1 kube-apiserver-amd64:v1.10.1
etcd-amd64:3.2.18 pause-amd64:3.1 kubernetes-dashboard-amd64:v1.8.3 k8s-dns-sidecar-amd64:1.14.10 k8s-dns-kube-dns-amd64:1.14.10
k8s-dns-dnsmasq-nanny-amd64:1.14.10)
for imageName in ${images[@]} ; do
docker pull longhuixuan/$imageName
docker tag longhuixuan/$imageName k8s.gcr.io/$imageName
docker rmi longhuixuan/$imageName
done
六、安裝 Docker
每臺機器都需要安裝 Docker,我這裡安裝的是1.13版本。
$ yum install -y docker
# 設置開啟啟動並啟動服務
$ systemctl enable docker && systemctl start docker
如出現以下錯誤
Error starting daemon: SELinux is not supported with the overlay2 graph driver on this kernel. Either boot into a newer kernel or disable selinux in docker (--selinux-enabled=false)
vim /etc/sysconfig/docker
# Modify these options if you want to change the way the docker daemon runs
OPTIONS='--selinux-enabled=false --log-driver=journald --signature-verification=false'
if [ -z "${DOCKER_CERT_PATH}" ]; then
DOCKER_CERT_PATH=/etc/docker
fi
修改Docker cgroup 的驅動為 cgroupfs
$ vim /usr/lib/systemd/system/docker.service
cgroupdriver=cgroupfs
七、安裝並配置 kubernetes 組件
需要安裝的 kubernetes 組件主要有 kubelet、kubeadm、kubectl 這幾個。針對可以翻牆的用戶可以 yum 配置 kubernetes 官方源:
vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
#gpgcheck=1
gpgcheck=0
#設置完成後,安裝kubelet、kubeadm、kubectl 組件
$ yum install -y kubelet kubeadm kubectl
# 設置開機啟動,以及啟動各組件
$ systemctl enable kubelet && systemctl start kubelet
安裝完畢後,我們還需要配置一下 kubelet,主要修改配置文件 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf中的 KUBELET_CGROUP_ARGS=cgroupfs配置。
這裡要特別強調一下,一定要修改kubelet 和 docker 的驅動為cgroupfs,修改後 reload 一下服務
$ systemctl daemon-reload
八、初始化啟動 Master
kubeadm init --kubernetes-version=v1.10.1 --pod-network-cidr=10.96.0.0/12
配置完主機後,我們可以啟動 Master 節點了。在執行初始化 init 時,kubernetes 並沒有選擇默認的 Pod Network,它支持很多種,這裡我們選擇 Flannel 作為 Pod Network,按照文檔說明,執行 init 時,需要帶上參數 --pod-network-cidr,即指定網絡區間,同時我們也可以通過 --kubernetes-version指定選擇 kubernetes 的版本號
九、在master 節點下安裝 Flannel 網絡組件
kubernetes 提供了很多種網絡組件選擇,有 Calia、Canal、Flannel、Kube-router、Romana、Weave Net 可以使用,具體使用可以參考 官方文檔 (3/4) Installing a pod network 來操作,這裡我們選擇 Flannel 作為網絡組件。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.0/Documentation/kube-flannel.yml
安裝完畢後,我們稍等一會再來查看下 pod 列表,看是不是都是Running狀態。
十、安裝kubernates-dashboard
1、生成證書
openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt
openssl req -newkey rsa:4096 -nodes -sha256 -keyout weishuichao.key -out weishuichao.csr
openssl x509 -req -in weishuichao.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out weishuichao.crt
2、導入證書到kube-system
kubectl create secret generic kubernetes-dashboard-certs --from-file=/data/cert -n kube-system
3、創建kubernetes-dashboard.yaml
kubectl apply -f /data/k8s/kubernetes-dashboard.yaml
配置在官網的基礎上需要加上下面配置ClusterRoleBinding,用以配置權限,這樣通過token登陸進去才不至於沒有權限
# ------------------- Dashboard ClusterRoleBinding ------------------- #
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: kubernetes-dashboard
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kube-system
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
kubernetes採用暴露端口的方式使用,增加一下配置
4、獲取kube-system 的secret
kubectl -n kube-system get secret
5、查看token,這個token 是用於登陸使用的
kubectl -n kube-system describe secret kubernetes-dashboard-token-2qmtr
6、訪問dashboard
https://192.168.2.107:31000 輸入令牌,進入dashboard主頁
十一、建立機器互信
1、在每臺服務器需要建立主機互信的用戶名執行以下命令生成公鑰/密鑰,默認回車即可
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
0c:1f:76:aa:80:b2:2f:b9:9a:6a:48:96:9d:8f:a1:cc root@cctvyyycns04The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| . o . |
| . = + |
|. + o S |
| * + . . |
|B.. + . |
|+E . . |
|Oo. |
+-----------------+
2、互傳公鑰,第一次需要輸入密碼,之後就OK了
$ ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.199.132
可以看到是在.ssh/下生成了個authorized_keys的文件,記錄了能登陸這臺服務器的其他服務器的公鑰
3、測試是否能登陸
$ ssh 192.168.199.132
十二、生成join token
kubeadm token create --print-join-command
把Node加入到master中去
kubeadm join 192.168.2.107:6443 --token uakb7l.mg4j5vprx87o1w4c --discovery-token-ca-cert-hash sha256:a0f50e9bb2fe44511b2ad068e65a1c903ab08cac0aa4329a0c1c70aff57b9cc0