Kubernetes安裝配置(包括master和node)


部署Kubernetes雲計算平台,至少准備兩台服務器,此處為4台,包括一台Docker倉庫:

Kubernetes Master節點:192.168.124.20
Kubernetes Node1節點:192.168.124.19
Kubernetes Node2節點:192.168.124.18
Docker私有庫節點:192.168.124.17

每台服務器主機上都運行如下命令:

systemctl stop firewalld
systemctl disable firewalld
setenforce 0 yum
-y install ntp ntpdate pool.ntp.org systemctl start ntpd systemctl enable ntpd

一、etcd服務簡介

1. ETCD是什么  

        ETCD是用於共享配置和服務發現的分布式,一致性的KV存儲系統。該項目目前最新穩定版本為2.3.0. 具體信息請參考[項目首頁]和[Github]。ETCD是CoreOS公司發起的一個開源項目,授權協議為Apache。

提供配置共享和服務發現的系統比較多,其中最為大家熟知的是[Zookeeper](后文簡稱ZK),而ETCD可以算得上是后起之秀了。在項目實現,一致性協議易理解性,運維,安全等多個維度上,ETCD相比Zookeeper都占據優勢。

2. ETCD vs ZK

        本文選取ZK作為典型代表與ETCD進行比較,而不考慮[Consul]項目作為比較對象,原因為Consul的可靠性和穩定性還需要時間來驗證(項目發起方自身服務並未使用Consul, 自己都不用)。 一致性協議: ETCD使用[Raft]協議, ZK使用ZAB(類PAXOS協議),前者容易理解,方便工程實現; 運維方面:ETCD方便運維,ZK難以運維; 項目活躍度:ETCD社區與開發活躍,ZK已經快死了; API:ETCD提供HTTP+JSON, gRPC接口,跨平台跨語言,ZK需要使用其客戶端; 訪問安全方面:ETCD支持HTTPS訪問,ZK在這方面缺失;

3. ETCD的使用場景

        和ZK類似,ETCD有很多使用場景,包括: 配置管理 服務注冊於發現 選主 應用調度 分布式隊列 分布式鎖 4. ETCD讀寫性能

按照官網給出的[Benchmark], 在2CPU,1.8G內存,SSD磁盤這樣的配置下,單節點的寫性能可以達到16K QPS, 而先寫后讀也能達到12K QPS。這個性能還是相當可觀的。 5. ETCD工作原理

ETCD使用Raft協議來維護集群內各個節點狀態的一致性。簡單說,ETCD集群是一個分布式系統,由多個節點相互通信構成整體對外服務,每個節點都存儲了完整的數據,並且通過Raft協議保證每個節點維護的數據是一致的。

4. ETCD讀寫性能

按照官網給出的[Benchmark], 在2CPU,1.8G內存,SSD磁盤這樣的配置下,單節點的寫性能可以達到16K QPS, 而先寫后讀也能達到12K QPS。這個性能還是相當可觀的。

5. ETCD工作原理

ETCD使用Raft協議來維護集群內各個節點狀態的一致性。簡單說,ETCD集群是一個分布式系統,由多個節點相互通信構成整體對外服務,每個節點都存儲了完整的數據,並且通過Raft協議保證每個節點維護的數據是一致的。

如圖所示,每個ETCD節點都維護了一個狀態機,並且,任意時刻至多存在一個有效的主節點。主節點處理所有來自客戶端寫操作,通過Raft協議保證寫操作對狀態機的改動會可靠的同步到其他節點。ETCD工作原理核心部分在於Raft協議。

6. ETCD使用案例

據公開資料顯示,至少有CoreOS, Google Kubernetes, Cloud Foundry, 以及在Github上超過500個項目在使用ETCD。

7. ETCD接口

ETCD提供HTTP協議,在最新版本中支持Google gRPC方式訪問。具體支持接口情況如下: ETCD是一個高可靠的KV存儲系統,支持PUT/GET/DELETE接口; 為了支持服務注冊與發現,支持WATCH接口(通過http long poll實現); 支持KEY持有TTL屬性; CAS(compare and swap)操作; 支持多key的事務操作; 支持目錄操作

二、Kubernetes master安裝與配置

1、安裝etcd和Kubernetes、Flannel網絡。

其中etcd可以獨立部署在一台機器上,本次和master安裝在同一台機器。

yum install kubernetes-master etcd flannel -y

2、修改/etc/etcd/etcd.conf配置文件,將localhost修改為本機IP地址,過濾#后完整配置如下:

ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://192.168.124.17:2379,,http://127.0.0.1:2379"
ETCD_NAME="default"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.124.17:2379"

3、修改/etc/kubernetes/config配置文件,完整代碼如下(紅色標注即修改的部分):

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

Kubernetes的apiserver進程的服務地址告訴Kubernetes的controller-manager, scheduler,proxy進程。

4、修改/etc/kubernetes/apiserver配置文件,完整代碼如下(紅色標注即修改的部分):

主要修改地方為,apiserver監聽地址和端口,連接etcd地址和端口:
# kubernetes system config # # The following values are used to configure the kube
-apiserver # # The address on the local server to listen to. KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" # The port on the local server to listen on. KUBE_API_PORT="--port=8080" # Port minions listen on # KUBELET_PORT="--kubelet-port=10250" # Comma separated list of nodes in the etcd cluster KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.124.17:2379" # Address range to use for services KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" # default admission control policies KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota" # Add your own! KUBE_API_ARGS=""

5、啟動Kubernetes Master節點上的etcd, apiserver, controller-manager和scheduler進程及狀態;

for  I  in  etcd  kube-apiserver  kube-controller-manager kube-scheduler; do systemctl restart  $I ;done
service flanneld restart
iptables -P FORWARD ACCEPT 

二、Kubernetes Node安裝配置

1、在Kubernetes Node節點上安裝flannel、docker和Kubernetes;

yum install kubernetes-node  docker flannel *rhsm* -y

 2、配置文件/etc/kubernetes/config,完整代碼如下(紅色標注即修改的部分):

###
# kubernetes system config
#
# The following values are used to configure various aspects of all
# kubernetes services, including
#
#   kube-apiserver.service
#   kube-controller-manager.service
#   kube-scheduler.service
#   kubelet.service
#   kube-proxy.service
# logging to stderr means we get it in the systemd journal
KUBE_LOGTOSTDERR="--logtostderr=true"
# journal message level, 0 is debug
KUBE_LOG_LEVEL="--v=0"
# Should this cluster be allowed to run privileged docker containers
KUBE_ALLOW_PRIV="--allow-privileged=false"
# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://192.168.124.17:8080"

3、修改配置文件/etc/kubernetes/kubelet,完整代碼如下(紅色標注即修改的部分):

###
# kubernetes kubelet (minion) config
# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=0.0.0.0"
# The port for the info server to serve on
# KUBELET_PORT="--port=10250"
# You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname-override=192.168.124.18"
# location of the api-server
KUBELET_API_SERVER="--api-servers=http://192.168.124.17:8080"
# pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
# Add your own!
KUBELET_ARGS=""

4、分別啟動Kubernetes Node節點上kube-proxy、kubelet、docker、flanneld進程並查看其狀態:

for  I  in  kube-proxy  kubelet  docker;do systemctl  restart  $I;done
service flanneld restart iptables
-P FORWARD ACCEPT

三、Kubernetes flanneld網絡配置 

1、Kubernetes整個集群所有服務器(Master、Minions)配置Flanneld,指定etcd地址,/etc/sysconfig/flanneld代碼如下:

# Flanneld configuration options  
# etcd url location.  Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="http://192.168.124.17:2379"
# etcd config key.  This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_PREFIX="/atomic.io/network"
# Any additional options that you want to pass
#FLANNEL_OPTIONS=""

2、Master服務器,創建flannel網絡配置。

etcdctl  mk  /atomic.io/network/config '{"Network":"172.17.0.0/16"}'

3、Kubernetes整個集群所有服務器(Master、Minions)重啟flannel

service flanneld restart

4、可以輸入如下代碼查看flannel網絡信息(互信ping,保證網絡互通):

etcdctl  member list
etcdctl cluster-health
etcdctl get /atomic.io/network/config    整個集群所在的大網段
etcdctl ls /atomic.io/network/subnets    列出分配node節點的子網段
etcdctl  rm   /atomic.io/network/   --recursive

Kubernetes的Node節點搭建和配置flannel網絡,etcd中/atomic.io/network/config節點會被Node節點上的flannel用來創建Doker IP地址網段。

                                            圖    master的網絡

 

                                           圖    node1的網卡信息

                                              圖    node2的網卡信息

 四、Kubernetes Dashboard UI實戰

        Kubernetes實現的最重要的工作是對Docker容器集群統一的管理和調度,通常使用命令行來操作Kubernetes集群及各個節點,命令行操作非常不方便,如果使用UI界面來可視化操作,會更加方便的管理和維護。

如下為配置kubernetes dashboard完整過程,在Node節點提前導入兩個列表鏡像(從雲盤下載即可)(或者pull更改鏡像名):

1)pod-infrastructure

2)kubernetes-dashboard-amd64

1、在node節點配置導入鏡像

docker load < pod-infrastructure.tgz
docker tag $(docker images|grep none|awk '{print $3}') registry.access.redhat.com/rhel7/pod-infrastructure       將導入的pod鏡像名稱修改
docker load < kubernetes-dashboard-amd64.tgz
docker tag $(docker images|grep none|awk '{print $3}') bestwu/kubernetes-dashboard-amd64:v1.6.3                  將導入的pod鏡像名稱修改

2、然后在Master端,創建dashboard-controller.yaml,代碼如下:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: kubernetes-dashboard
  namespace: kube-system
  labels:
    k8s-app: kubernetes-dashboard
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    matchLabels:
      k8s-app: kubernetes-dashboard
  template:
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
      annotations:
        scheduler.alpha.kubernetes.io/critical-pod: ''
        scheduler.alpha.kubernetes.io/tolerations: '[{"key":"CriticalAddonsOnly", "operator":"Exists"}]'
    spec:
      containers:
      - name: kubernetes-dashboard
        image: bestwu/kubernetes-dashboard-amd64:v1.6.3
        resources:
          # keep request = limit to keep this container in guaranteed class
          limits:
            cpu: 100m
            memory: 50Mi
          requests:
            cpu: 100m
            memory: 50Mi
        ports:
        - containerPort: 9090
        args:
          - --apiserver-host=http://10.6.191.181:8080
        livenessProbe:
          httpGet:
            path: /
            port: 9090
          initialDelaySeconds: 30
          timeoutSeconds: 30

3、創建dashboard-service.yaml,代碼如下:

apiVersion: v1
kind: Service
metadata:
  name: kubernetes-dashboard
  namespace: kube-system
  labels:
    k8s-app: kubernetes-dashboard
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    k8s-app: kubernetes-dashboard
  ports:
  - port: 80
    targetPort: 9090

4、創建dashboard dashborad pods模塊:

kubectl create -f dashboard-controller.yaml
kubectl create -f dashboard-service.yaml 

刪除dashboard dashborad pods模塊:

kubectl delete -f dashboard-controller.yaml
kubectl delete -f dashboard-service.yaml 

5、創建完成后,查看Pods和Service的詳細信息:

kubectl get services kubernetes-dashboard -n kube-system      #查看所有service
kubectl get deployment kubernetes-dashboard -n kube-system    #查看所有發布
kubectl get pods --all-namespaces                             #查看所有pod
kubectl get pods -o wide --all-namespaces #查看所有pod的IP及節點
kubectl get pods -n kube-system | grep dashboard
kubectl describe service/kubernetes-dashboard --namespace="kube-system"
kubectl describe pods/kubernetes-dashboard-349859023-g6q8c --namespace="kube-system" #指定類型查看
kubectl describe pod nginx-772ai                              #查看pod詳細信息
kubectl scale rc nginx --replicas=5                           # 動態伸縮
kubectl scale deployment redis-slave --replicas=5             #動態伸縮
kubectl scale --replicas=2 -f redis-slave-deployment.yaml     #動態伸縮
kubectl exec -it redis-master-1033017107-q47hh /bin/bash      #進入容器
kubectl label nodes node1 zone=north                          #增加節點lable值 spec.nodeSelector: zone: north #指定pod在哪個節點
kubectl get nodes -lzone                                      #獲取zone的節點
kubectl label pod redis-master-1033017107-q47hh role=master   #增加lable值 [key]=[value]
kubectl label pod redis-master-1033017107-q47hh role-         #刪除lable值
kubectl label pod redis-master-1033017107-q47hh role=backend --overwrite    #修改lable值
kubectl rolling-update redis-master -f redis-master-controller-v2.yaml      #配置文件滾動升級
kubectl rolling-update redis-master --image=redis-master:2.0                #命令升級
kubectl rolling-update redis-master --image=redis-master:1.0 --rollback     #pod版本回滾 

6、報錯信息

1)導入模板時報錯

此時需要把apiserver監聽端口改為0.0.0.0

2)創建模板后執行顯示沒有資源

查看系統日志/var/log/message

解決方法:修改apiserver配置文件vim /etc/kubernetes/apiserver

KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
刪除認證模塊,修改為如下代碼
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota"

重啟apiserver。

service kube-apiserver restart

3、訪問UI時報錯

原因分析:連接遠程服務器10.0.66.2的9090無法連接,應該屬於網絡的問題;

解決方法:

iptables -P FORWARD ACCEPT

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM