CentOS 7搭建---K8S集羣

環境準備

集羣數量此次使用3臺CentOS 7系列機器,分別爲7.3,7.4,7.5

節點名稱 節點IP
k8s-server 192.168.48.131
k8s-client1 192.168.48.132
k8s-client2 192.168.48.133

主要事項

1、k8s-server節點安裝配置etcd服務,作爲k8s集羣主數據庫,保存所有資源的信息
2、所有節點安裝配置k8s服務,針對k8s-server和k8s-client分別配置各項服務
3、所有節點安裝配置flannel服務,用於跨主機容器間通信

前提

1.關閉防火牆,否則節點間無法通信,使用以下命令關閉防火牆和禁止開機啓動

systemctl stop firewalld.service
systemctl disable firewalld.service

2.修改selinux,修改/etc/sysconfig/selinux 

SELINUX=disabled

3.安裝網絡工具net-tools

yum install net-tool -y

最後最好重啓一次,reboot

k8s-server節點安裝配置etcd

安裝採用yum方式,並且只是安裝單機的etcd服務,如果考慮高可用需要部署etcd集羣

yum install -y etcd

安裝完成後,/etc/etcd/etcd.conf配置文件作如下配置,

ETCD_NAME="k8s-server"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.48.131:2379"

其中,

  • ETCD_NAME:節點名稱
  • ETCD_DATA_DIR:數據存儲目錄
  • ETCD_LISTEN_CLIENT_URLS:與客戶端(etcdctl、curl)通信時的監聽地址列表
  • ETCD_ADVERTISE_CLIENT_URLS:對外公告的該節點客戶端監聽地址

配置完啓動etcd服務,並配置開機啓動

systemctl start etcd
systemctl enable etcd

查看etcd健康狀態,確定etcd服務狀態正常,

[root@k8s-server ~]# etcdctl cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://192.168.48.131:2379
cluster is healthy

所有節點安裝配置K8S

1、k8s-server節點

在k8s-server節點機器上安裝k8s,同樣使用yum方式,

yum install -y kubernetes

在k8s k8s-server節點上需要運行以下組件:

  • Kubernetes API Server:提供http restful接口服務,也是集羣控制入口
  • Kubernetes Controller Manager:資源對象控制中心
  • Kubernetes Scheduler:負責pod的調度

配置kube-apiserver服務,修改/etc/kubernetes/apiserver文件如下:

KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.48.131:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
KUBE_API_ARGS=""

其中,

  • KUBE_API_ADDRESS:配置apiserver服務綁定的不安全ip
  • KUBE_API_PORT:配置apiserver服務端口,默認情況下,8080用於接收http請求,6443用於接收https請求
  • KUBE_ETCD_SERVERS:配置etcd服務ip
  • KUBE_SERVICE_ADDRESSES:配置集羣使用的虛擬IP池
  • KUBE_ADMISSION_CONTROL:配置RESTFUL API 准入選項

修改/etc/kubernetes/config文件如下:

KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://192.168.48.131:8080"

其中

  • KUBE_LOGTOSTDERR:設置日誌輸出
  • KUBE_LOG_LEVEL:設置日誌級別
  • KUBE_ALLOW_PRIV:設置是否允許特權
  • KUBE_MASTER:設置master節點apiserver地址

除了KUBE_MASTER需要配置,其餘均保持默認設置即可。

對於kube-controller-manager和kube-scheduler兩個服務,無需其他配置,按照系統默認參數即可。

設置kube-apiserver、kube-controller-manager和kube-scheduler服務開啓啓動,並啓動服務.

systemctl enable kube-apiserver kube-controller-manager kube-scheduler
systemctl start kube-apiserver kube-controller-manager kube-scheduler

2、k8s-client節點

在k8s-client節點機器上安裝k8s,仍然使用yum方式,

yum install -y kubernetes

對於k8s-client節點,需要運行以下組件

  • kubelet:負責pod上容器的創建、啓停,並與k8s-server節點共同實現集羣管理
  • kube-proxy:實現服務的通信和負載均衡

上面我們提到,k8s-client也需要安裝kubernetes,因此我們直接開始配置。

配置kubelet,修改/etc/kubernetes/kubelet文件如下:
 

KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_HOSTNAME="--hostname-override=192.168.48.132"
KUBELET_API_SERVER="--api-servers=http://192.168.48.131:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""

其中,

  • KUBELET_ADDRESS:設置kubelet綁定ip
  • KUBELET_HOSTNAME:設置當前節點的hostname,記得不要重複了(192.168.48.132/192.168.48.133’)
  • KUBELET_API_SERVER:設置master上apiserver的ip地址
  • KUBELET_POD_INFRA_CONTAINER:設置基礎鏡像拉取地址,如果訪問不了換個國內的地址

修改/etc/kubernetes/config文件如下:

KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://192.168.48.131:8080"

該配置和k8s-server節點上相同。

kube-proxy服務無需其他配置。

啓動kubelet、kube-proxy服務,並設置爲開啓動,

systemctl start kubelet kube-proxy
systemctl enable kubelet kube-proxy

同樣的操作在另一個節點配置。如果節多,可以考慮使用ansible批量部署。

部署完k8s-client節點,我們就能在k8s-server上查看節點信息了。

[root@k8s-server ~]#  kubectl get node
NAME             STATUS    AGE
192.168.48.132   Ready     56m
192.168.48.133   Ready     57m

所有節點安裝配置flannel

flannel的安裝是爲了解決跨主機容器間的通信。

1、在k8s-server和k8s-client節點上執行以下操作

安裝flannel

yum install -y flannel

修改配置文件/etc/sysconfig/flanneld如下,

FLANNEL_ETCD_ENDPOINTS="http://192.168.48.131:2379"
FLANNEL_ETCD_PREFIX="/flannel/network"

其中,

  • FLANNEL_ETCD_ENDPOINTS:設置etcd的訪問URL
  • FLANNEL_ETCD_PREFIX:設置etcd變量前綴

2、在k8s-server節點上添加網絡

k8s-server上配置有etcd服務,因此我們使用etcdctl命令設置該集羣的網絡信息。

etcdctl set /flannel/network/config '{"Network":"10.8.0.0/16"}'

其中,/flannel/network/和上面的FLANNEL_ETCD_PREFIX對應。

3、重啓k8s-server和k8s-client節點上各個服務

由於flannel會將docker0覆蓋,因此需要重啓docker服務。

對於k8s-server,

systemctl restart docker kube-apiserver kube-controller-manager kube-scheduler

對於k8s-client,

systemctl restart kube-proxy kubelet docker

4、所有節點啓動flannel服務,並設置開啓啓動

systemctl restart flanneld
systemctl enable flanneld

啓動後就能看到節點上的flannel網絡,並且該網絡正是我們配置的ip範圍。
k8s-server節點上flannel信息,

[root@k8s-server ~]# ifconfig flannel0
flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1472
        inet 10.8.71.0  netmask 255.255.0.0  destination 10.8.71.0
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

k8s-client節點上flannel信息,

[root@k8s-client1 ~]# ifconfig flannel0
flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1472
        inet 10.8.25.0  netmask 255.255.0.0  destination 10.8.25.0
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@k8s-client2 flannel]#  ifconfig flannel0
flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1472
        inet 10.8.36.0  netmask 255.255.0.0  destination 10.8.36.0
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

總結

其實到這,k8s的集羣就搭建完了,但這只是最簡單的一個集羣,並沒有考慮集羣的高可用。

因此,實際的集羣還需要以下操作:

  • 針對etcd進行集羣化,保證高可用
  • 針對master節點進行擴充,避免單點故障

文章引用:

https://blog.csdn.net/u010039418/article/details/90235873

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章