1. 程式人生 > >kubernetes環境搭建

kubernetes環境搭建

一.環境準備

三臺vm虛擬機器(centos7)

192.168.125.164  node1
192.168.125.165  node2
192.168.125.166  node3

1.各節點修改各自的主機名(hostnamectl set-hostname node1),並將上面的內容新增到/etc/hosts中。

2.各節點安裝kubernetes    #yum -y install kubernetes ,目前是kubernetes.x86_64 0:1.5.2-0.5.gita552679.el7版本

3.在master節點上安裝etcd   #yum -y install etcd ,目前是3.1.3-1.el7版本

4.將各節點的防火牆關閉

    #systemctl disable firewalld

    #systemctl stop firewalld

二.配置

1.每個節點修改/etc/kubernetes/config

    KUBE_MASTER="--master=http://192.168.125.164:8080"
    KUBE_ETCD_SERVERS="--etcd_servers=http://192.168.125.164:4001"

2.在master節點上vi /etc/kubernetes/apiserver

    KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
    KUBE_API_PORT="--port=8080"

3.在master啟動服務

    for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler;do

          systemctl restart $SERVICES

          systemctl enable $SERVICES

          systemctl  status  $SERVICES

    done

    將上面的儲存成sh執行

   #ps -ef|grep kube   //從程序中檢視前面的引數配置是否生效

4.在node節點修改vi  /etc/kubernetes/kubelet

    KUBELET_ADDRESS="--address=0.0.0.0"
    KUBELET_PORT="--port=10250" (可不用解開註釋,預設即可
    KUBELET_HOSTNAME="--hostname-override=node2"
    KUBELET_API_SERVER="--api-servers=http://192.168.125.164:8080"

 5.node節點機啟動kube-proxy和kubelet,docker服務即可。

     啟動中可通過#tail -f /var/log/messages |grep kube來排查問題

三. 驗證

    在master節點執行kubectl get nodes  ,檢視到節點註冊成功,則表明系統安裝正常

   #kubectl cluster-info  // 檢視cluster info資訊

四.master上的kubectrl命令為管理叢集的命令

     其中用的最多的就是資源管理命令:get   //list資源,也是查詢

                                                                     describe  //查詢具體,相信的資訊

                                                                     create

                                                                     replace

                                                                     patch

                                                                     delete

    #kubectl describe --help   //檢視幫助

   #kubectl get namespace  //這裡的namespace不是用來隔離的,而是用來實現不用租戶的資源配額。

五.釋出個nginx應用

vi nginx-pod.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
#kubectl create -f nginx-pod.yaml

此時提示
Error from server (ServerTimeout): error when creating "nginx-pod.yaml": No API token found for service account "default", retry after the token is automatically created and added to the service account

解決:

修改master節點上的/etc/kubernetes/apiserver 檔案,去掉vi /etc/kubernetes/apiserver  中的“ServiceAccount”,儲存,重啟api-server服務(#systemctl restart kube-apiserver)

然後可以通過# kubectl get pods  檢視pod進展

也可以通過# kubectl describe pods nginx 檢視詳細

注意:create資源之前,需要先將/etc/kubernetes/kubelet中的那個 映象 先下載到各個節點上(如registry.access.redhat.com/rhel7/pod-infrastructure:latest)。

六.建立Kubernetes覆蓋網路

      Kubernetes的網路模型要求每個Pod都擁有一個扁平化共享網路名稱空間的IP,Pod之間能夠通過跨主機通訊,要實現這種需求,需要在Kubernetes叢集中建立一個覆蓋網路來聯通各個節點,目前可以通過第三方網路外掛來建立覆蓋網路,如Flannel,Open vSwitch(OVS)和 calico.

     Flannel

     i.在每臺節點進行安裝#yum install flannel   ,當前是flannel.x86_64 0:0.7.0-1.el7版本

     ii.修改配置檔案 /etc/sysconfig/flanneld,

         FLANNEL_ETCD_ENDPOINTS="http://192.168.125.164:2379" (如果叢集每個節點都安裝了etcd的話這裡就可以保持預設,我這裡是就在master節點安裝了etcd)

         FLANNEL_ETCD_PREFIX="/atomic.io/network"  --------可以保持預設

      iii.執行etcdctl mkdir /atomic.io/network && etcdctl set /k8s/network/config '{"Network":"172.200.0.0/16"}'(在etcd中建立目錄及config配置檔案,docker執行的container例項的地址,都在 172.200.0.0/16網段中)

         flanneld會讀取/atomic.io/network目錄中config值,然後接管docker的地址分配,並把docker和宿主機之間的網路橋接起來。、

         注意:如果執行命令出現

Error: client: etcd cluster is unavailable or misconfigured
error #0: dial tcp 127.0.0.1:2379: getsockopt: connection refused
error #1: dial tcp 127.0.0.1:4001: getsockopt: connection refuse

                解決辦法:vi /etc/etcd/etcd.conf

                                ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,http://192.168.125.164:2379",儲存,重啟etcd服務

       vi.執行 #systemctl enable flanneld.service 

                    #systemctl stop docker  

                   #systemctl star flanneld.service

                   #systemctl star docker

             注意:後續確保系統啟動時flannel需要遭遇docker服務(可將docker服務systemctl disable docker)

     整合calico網路

     i.準備工作:

       . 每個節點修改/etc/kubernetes/config中的 KUBE_ALLOW_PRIV="--allow-privileged=true" ,不然釋出calico.yaml時報錯

The DaemonSet "calico-node" is invalid: spec.template.spec.containers[0].securityContext.privileged: Forbidden: disallowed by policy

       .因為用到quay.io/calico/node:v1.0.2,calico/cni:v1.5.6映象,為了加快部署速度,可以現在每個節點docker pull下來。

   ii.配置安裝

      .下載calico.yaml,地址為http://docs.projectcalico.org/v2.0/getting-started/kubernetes/installation/hosted/calico.yaml

   .修改calico.yaml檔案中的etcd的地址  

etcd_endpoints: "http://192.168.125.164:2379"

   .通過#kubectl apply -f calico.yaml部署上去

 七.kubernetes相關元件安裝

      1.dashboard 

        #kubectl create -f https://git.io/kube-dashboard-no-rbac

        出現的問題“Error syncing pod, skipping: failed to "StartContainer" for "kubernetes-dashboard" with ImagePullBackOff: "Back-off pulling image \"gcr.io/google_containers/kubernetes-dashboard-amd64:v1.6.0\""”

         解決辦法:

                 方法一:翻牆

                 方法二:修改hosts檔案(這裡我用的是“61.91.161.217 gcr.io”,但是可能會失效)

                 方法三:從其他源下載該容器,然後打tag為“gcr.io/。。。。”