搭建 kubernetes 叢集
技術標籤:r容器管理kubernetesk8s
參考:https://blog.csdn.net/u010039418/article/details/90235873
1. 環境準備
我準備了3臺 centos7.9 的虛擬機器,1核3g的配置。分別是:192.168.56.104(master),192.168.56.102(node1),192.168.56.105(node2)
安裝Docker和K8S叢集的伺服器作業系統版本需要在CentOS 7以上。
關閉防火牆
$ systemctl stop firewalld # 關閉防火牆 $ systemctl disable firewalld # 禁止開機啟動
master 節點安裝配置 etcd
安裝採用yum方式,並且只是安裝單機的etcd服務,如果考慮高可用需要部署etcd叢集。
$ yum install -y etcd
安裝完成後,覆蓋如下配置:vim /etc/etcd/etcd.conf
# 節點名稱 ETCD_NAME="master" # 資料儲存目錄 ETCD_DATA_DIR="/var/lib/etcd/default.etcd" # 與客戶端(etcdctl、curl)通訊時的監聽地址列表 ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" # 對外公告的該節點客戶端監聽地址,配置的是 master 地址 ETCD_ADVERTISE_CLIENT_URLS="http://192.168.56.104:2379"
配置完啟動etcd服務,並配置開機啟動:
$ systemctl start etcd
$ systemctl enable etcd
檢視etcd健康狀態,確定etcd服務狀態正常,
[[email protected] etcd]# etcdctl cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://192.168.56.104:2379
cluster is healthy
安裝Docker
$ yum install -y docker # yum安裝docker
vim /etc/docker/daemon.json,新增docker國內映象庫和國內映象加速器站點(這是我自己的阿里加速站點,可以自行百度解決)。
# 重新載入docker配置,重啟docker
$ systemctl start docker
$ systemctl enable docker #把docker服務放到開機啟動
2. 搭建kubernetes叢集
2.1、部署master節點(192.168.56.104)
在 master 節點機器上安裝k8s
yum install -y kubernetes
在k8s master節點上需要執行以下3個元件:
- Kubernetes API Server:提供http restful介面服務,也是叢集控制入口
- Kubernetes Controller Manager:資源物件控制中心
- Kubernetes Scheduler:負責pod的排程
配置 kube-apiserver 服務,修改 /etc/kubernetes/apiserver 如下:
# 配置apiserver服務繫結的不安全ip(要改)
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
# 配置apiserver服務埠,預設情況下,8080用於接收http請求,6443用於接收https請求
KUBE_API_PORT="--port=8080"
# 配置etcd叢集管理服務地址(要改)
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.56.104:2379"
# 配置叢集使用的虛擬IP池
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
# 配置RESTFUL API 准入選項
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
KUBE_API_ARGS=""
修改 /etc/kubernetes/config 配置,除了KUBE_MASTER,其餘均保持預設即可:
# 設定日誌輸出
KUBE_LOGTOSTDERR="--logtostderr=true"
# 日誌級別
KUBE_LOG_LEVEL="--v=0"
# 是否允許特權
KUBE_ALLOW_PRIV="--allow-privileged=false"
# 設定master節點apiserver地址(要改)
KUBE_MASTER="--master=http://192.168.56.104:8080"
對於 kube-controller-manager 和 kube-scheduler 兩個服務,無需其他配置,按照系統預設引數即可。
啟動服務,並設定開機啟動。
$ systemctl enable kube-apiserver kube-controller-manager kube-scheduler
$ systemctl start kube-apiserver kube-controller-manager kube-scheduler
2.2、部署node節點(192.168.56.102,192.168.56.104)
在node節點機器上安裝k8s
yum install -y kubernetes
對於node節點,需要執行以下元件
- kubelet:負責pod上容器的建立、啟停,並與master節點共同實現叢集管理
- kube-proxy:實現服務的通訊和負載均衡
配置kubelet,修改 /etc/kubernetes/kubelet 配置:
# 設定kubelet繫結ip
KUBELET_ADDRESS="--address=0.0.0.0"
# 設定當前節點的hostname,記得不要重複
KUBELET_HOSTNAME="--hostname-override=192.168.56.102"
# 設定master節點上的apiserver的地址
KUBELET_API_SERVER="--api-servers=http://192.168.56.104:8080"
# 設定基礎映象拉取地址,上面這個地址我根據docker pull命令拉不下來。下面那個映象地址是我用docker search 搜到的
# KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=tianyebj/pod-infrastructure:latest"
KUBELET_ARGS=""
配置基礎映象拉取地址時,上面那個類似於官方地址的。我docker pull失敗,所以又重新搜了一個。可以看下圖結果:
修改 /etc/kubernetes/config 檔案如下,配置和master節點上相同:
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://192.168.56.104:8080"
kube-proxy服務無需其他配置。
啟動 kubelet、kube-proxy 服務,並設定開機啟動:
$ systemctl start kubelet kube-proxy
$ systemctl enable kubelet kube-proxy
如果節多,可以考慮使用ansible批量部署。
第2臺node節點機器配置步驟相同。等兩個node節點部署完成,我們在 master 上檢視節點資訊,如下:
3. 所有節點安裝配置flannel
flannel的安裝是為了解決跨主機容器間的通訊。
3.1、在 master 和 node 節點上執行以下操作
$ yum install -y flannel
修改配置 /etc/sysconfig/flanneld 如下,
# 設定master節點的etcd服務地址
FLANNEL_ETCD_ENDPOINTS="http://192.168.56.104:2379"
# 設定etcd變數訪問字首
FLANNEL_ETCD_PREFIX="/flannel/network"
3.2、在master節點上新增網路
master 上配置有etcd服務,因此我們使用etcdctl命令設定該叢集的網路資訊。
etcdctl set /flannel/network/config '{"Network":"10.8.0.0/16"}'
其中,/flannel/network/ 和上面的 FLANNEL_ETCD_PREFIX 對應。
3.3、重啟master和node節點上各個服務
由於flannel會將docker0覆蓋,因此需要重啟docker服務。
重啟 master 服務
$ systemctl restart docker kube-apiserver kube-controller-manager kube-scheduler
重啟 node 服務
$ systemctl restart docker kube-proxy kubelet
3.4、所有節點啟動flannel服務,並設定開啟啟動
$ systemctl restart flanneld
$ systemctl enable flanneld
啟動後就能看到節點上的flannel網路,並且該網路正是我們配置的ip範圍。
master節點上flannel資訊
node1節點上flannel資訊
總結
其實到這,k8s的叢集就搭建完了,但這只是最簡單的一個叢集,並沒有考慮叢集的高可用。
因此,實際的叢集還需要以下操作:
- 針對etcd進行叢集化,保證高可用
- 針對master節點進行擴充,避免單點故障