kubernetes 安裝學習

 

 

什麼是Kubernetes

Kubernetes是一個開源平臺,用於跨主機羣集自動部署,擴展和操做應用程序容器,提供以容器爲中心的基礎架構。html

使用Kubernetes,您能夠快速高效地響應客戶需求:node

  • 快速,可預測地部署應用程序。
  • 在運行中擴展應用程序。
  • 無縫推出新功能。
  • 僅使用您須要的資源來優化硬件的使用。

咱們的目標是創建一個組件和工具的生態系統,以減輕在公共雲和私有云中運行應用程序的負擔。nginx

Kubernetes是:

Kubernetes是Google開源的容器集羣管理系統,實現基於Docker構建容器,利用Kubernetes能很方面管理多臺Docker主機中的容器。 git

主要功能以下:redis

1)將多臺Docker主機抽象爲一個資源,以集羣方式管理容器,包括任務調度、資源管理、彈性伸縮、滾動升級等功能。docker

2)使用編排系統(YAML File)快速構建容器集羣,提供負載均衡,解決容器直接關聯及通訊問題shell

3)自動管理和修復容器,簡單說,好比建立一個集羣,裏面有十個容器,若是某個容器異常關閉,那麼,會嘗試重啓或從新分配容器,始終保證會有十個容器在運行,反而殺死多餘的。數據庫

kubernetes角色組成:vim

1)Pod後端

Pod是kubernetes的最小操做單元,一個Pod能夠由一個或多個容器組成;

同一個Pod只能運行在同一個主機上,共享相同的volumes、network、namespace;

2)ReplicationController(RC)

RC用來管理Pod,一個RC能夠由一個或多個Pod組成,在RC被建立後,系統會根據定義好的副本數來建立Pod數量。在運行過程當中,若是Pod數量小於定義的,就會重啓中止的或從新分配Pod,反之則殺死多餘的。固然,也能夠動態伸縮運行的Pods規模。

RC經過label關聯對應的Pods,在滾動升級中,RC採用一個一個替換要更新的整個Pods中的Pod。

3)Service

Service定義了一個Pod邏輯集合的抽象資源,Pod集合中的容器提供相同的功能。集合根據定義的Label和selector完成,當建立一個Service後,會分配一個Cluster IP,這個IP與定義的端口提供這個集合一個統一的訪問接口,而且實現負載均衡。

4)Label

Label是用於區分Pod、Service、RC的key/value鍵值對; 

Pod、Service、RC能夠有多個label,可是每一個label的key只能對應一個;

主要是將Service的請求經過lable轉發給後端提供服務的Pod集合;

kubernetes組件組成:

1)kubectl

客戶端命令行工具,將接受的命令格式化後發送給kube-apiserver,做爲整個系統的操做入口。

2)kube-apiserver

做爲整個系統的控制入口,以REST API服務提供接口。

3)kube-controller-manager

用來執行整個系統中的後臺任務,包括節點狀態情況、Pod個數、Pods和Service的關聯等。

4)kube-scheduler

負責節點資源管理,接受來自kube-apiserver建立Pods任務,並分配到某個節點。

5)etcd

負責節點間的服務發現和配置共享。

6)kube-proxy

運行在每一個計算節點上,負責Pod網絡代理。定時從etcd獲取到service信息來作相應的策略。

7)kubelet

運行在每一個計算節點上,做爲agent,接受分配該節點的Pods任務及管理容器,週期性獲取容器狀態,反饋給kube-apiserver。

8)DNS

一個可選的DNS服務,用於爲每一個Service對象建立DNS記錄,這樣全部的Pod就能夠經過DNS訪問服務了。

 

基本部署步驟:

1)minion節點安裝docker

2)minion節點配置跨主機容器通訊

3)master節點部署etcd、kube-apiserver、kube-controller-manager和kube-scheduler組件

4)minion節點部署kubelet、kube-proxy組件

 

 



kubernetes 1.5.2 yum源


[virt7-docker-common-candidate]
name=virt7-docker-common-candidate
baseurl=https://cbs.centos.org/repos/virt7-docker-common-candidate/x86_64/os/
enabled=1
gpgcheck=0
EOF


使用阿里雲yum源
wget http://mirrors.aliyun.com/repo/Centos-7.repo wget http://mirrors.aliyun.com/repo/epel-7.repo  [root@master ~] yum -y install kubernetes etcd
[root@master ~] cd /etc/kubernetes/
[root@master ~] ls
apiserver config controller-manager sheduler

修改master apiserver 文件
 [root@master ~]  cat apiserver

  KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"

  KUBE_API_PORT="--port=8080"

  KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.20.226: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=""

 

  修改 master config 文件

  KUBE_LOGTOSTDERR="--logtostderr=true"

  KUBE_LOG_LEVEL="--v=0"

  KUBE_ALLOW_PRIV="--allow-privileged=false"

  KUBE_MASTER="--master=http://192.168.20.226:8080"

 

  修改master  etcd配置文件

  ETCD_NAME=default
  ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
  ETCD_LISTEN_CLIENT_URLS="http://192.168.20.226:2379"
  ETCD_ADVERTISE_CLIENT_URLS="http://192.168.20.226:2379"


master 啓動kubernetes 和 etcd 服務

etcd.service
kube-apiserver.service kube-controller-manager.service kube-scheduler.service

systemctl  start etcd.service
systemctl  start kube-apiserver.service
systemctl  start kube-controller-manager.service
systemctl start kube-scheduler.service

node節點配置

node 節點配置
[root@docker223 ~]# yum kubernetes docker openswitch

openvswitch 網絡互通 查看http://www.cnblogs.com/fengjian2016/p/6253039.html
[root@docker223 ~]#  vim /etc/kubernetes/kubelet 

 KUBELET_ADDRESS="--address=0.0.0.0"

 KUBELET_HOSTNAME="--hostname-override=192.168.20.223"

 KUBELET_API_SERVER="--api-servers=http://192.168.20.226:8080"

 KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

 KUBELET_ARGS=""

[root@docker223 kubernetes]# vim /etc/kubernetes/config 

 KUBE_LOGTOSTDERR="--logtostderr=true"

 KUBE_LOG_LEVEL="--v=0"

 KUBE_ALLOW_PRIV="--allow-privileged=false"

 KUBE_MASTER="--master=http://192.168.20.226:8080"



node 啓動kubernetes 服務 kubelet.service   kube-proxy.service
[root@docker223 kubernetes]# systemctl start kube-kubelet.service
[root@docker223 kubernetes]# systemctl start kube-proxy.service

 

其餘node節點  修改 /etc/kubernetes/kubelet KUBELET_HOSTNAME="--hostname-override=192.168.20.223"(本身的ip地址),

/etc/kubernetes/config  KUBE_MASTER="--master=http://192.168.20.226:8080" master地址

而後啓動kubelet 和 kube-proxy 服務

 





 

在master 查看 node狀態

[root@master ~] # kubectl get nodes

 

 

[root@master ~] # kubectl get node 192.168.20.223

 

 

 

 

配置pod和容器

必定義容器的環境變量

建立pod時,能夠爲在pod中運行的容器是這環境變量, 要設置環境變量,須要env 字段包含在配置文件中

pod的配置文件定義了一個 名稱DEMO_GREETING 和 值爲 環境變量 「Hello from the environment」

pod.yaml

apiVersion: v1
kind: Pod
metadata:                           #元數據信息
  name: envar-demo                  #kubectl get  pods 和 登錄容器顯示的名字
  labels:                           #標籤
    purpose: demonstrate-envars     #標籤,能夠做爲查詢條件 kubectl get pods -l purpose=demonsstrate-envars
spec:                  #規格
  containers:                       #容器
  - name: envar-demo-container      #容器名稱
    image: docker.cinyi.com:443/senyint/centos7.3   #使用的鏡像
    env:                 #設置env,登錄到容器中查看環境變量, DEME_GREETING 的值是 "hello from the enviroment"
    - name:DEME_GREETING
      value: "hello from the environment"

1. 基於YAML配置文件建立pod
[root@master ~]# kubectl create -f pod.yaml

2.列出正在運行的pods
[root@master ~]# kubectl get pods

3.列出標籤中 purpose等於demonstrate-envars的pod
[root@master ~]# kubectl get pods -l purpose=demonstrate-envars
   

 

  4.獲取一個shell 進入到pod 中運行的容器中

 [root@master ~]# kubectl exec -it envar-demon /bin/bash

 

 

2、定義容器的命令和參數

建立pod時,能夠爲在pod中運行的容器定義命令和參數, 要定義命令,須要把command字段包含在配置文件中, 要定義參數,請將該args字段包含在配置文件中,建立pod後, 沒法更改定義的命令和參數

您在配置文件中定義的命令和參數會覆蓋容器圖像提供的默認命令和參數

command_pod.yaml
apiVersion: v1 kind: Pod metadata: name: command
-demo labels: purpose: demonstrate-command spec: containers: - name: command-demo-container image: docker.cinyi.com:443/senyint/centos7.3 command: ["printenv"] args: ["HOSTNAME", "KUBENETES_PORT"]

1. 基於yaml配置文件常見pod
[root@master ~]# kubectl create -f command_pod.yaml

2.列出正在運行的pods
[root@master ~]# kubectl get pods

3. 查看容器中運行的命令的輸出,請查看pod中的日誌
[root@master ~]# kubectl log comman-demon

顯示的HOSTNAME 和 KUBENETES_PORT環境變量值爲

 

 

 

3、想容器分配CPU 和RAM 資源

建立Pod時,能夠爲在Pod中運行的容器請求CPU和RAM資源。您還能夠設置CPU和RAM資源的限制。要請求CPU和RAM資源,請resources:requests在配置文件中包含該字段。要設置CPU和RAM資源的限制,請包括 resources:limits字段。

只有當節點有足夠的CPU和RAM可用來知足Pod中全部容器請求的總CPU和RAM時,Kubernetes纔會計劃一個Pod在節點上運行。此外,當容器在節點上運行時,Kubernetes不容許容器使用的CPU和RAM超過爲容器指定的限制。若是容器超過其RAM限制,它將終止。若是容器超過其CPU限制,它將成爲其CPU使用受到限制的候選。

Pod的配置文件請求250 milicpu和64 mebibtes的RAM。它還設置了1 cpu和128兆字節RAM的上限

cpu_ram_pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: cpu-ram-demo
spec:
  containers:
  - name: cpu-ram-demo-container
    image: gcr.io/google-samples/node-hello:1.0
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "1"


1. 基於yaml配置文件常見pod

[root@master ~]# kubectl create -f cpu_ram_pod.yaml

2. 查看pods cpu-ram-demon詳細信息

 

4、配置單元以將卷用於存儲

容器的文件系統只存在於容器中,所以當容器終止並從新啓動時,文件系統的更改將丟失。對於獨立於容器的更一致的存儲,您可使用 卷。這對於狀態應用程序(例如鍵值存儲和數據庫)尤爲重要。例如,Redis是一個鍵值緩存和存儲。

建立一個運行一個容器的Pod。這個Pod有一個類型爲EmptyDir的卷, 它持續了Pod的生命週期,即便容器終止和從新啓動。這裏是Pod的配置文件


apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
  - name: redis
    image: redis
    volumeMounts:
    - name: redis-storage
      mountPath: /data/redis
  volumes:
  - name: redis-storage
    emptyDir: {}

 

使用服務訪問集羣中的應用程序

目的

  • 運行Hello World應用程序的兩個實例。
  • 建立公開節點端口的Service對象。
  • 使用Service對象訪問正在運行的應用程序

 

1. 在進去中運行Hello World應用程序

[root@kubernetes ~]#  kubectl run hello-world --replicas=2 --labels="run=load-balancer-example" --image=gcr.io/google-samples/node-hello:1.0  --port=8080

上述命令將建立一個 Deployment 對象和一個關聯的 ReplicaSet 對象。ReplicaSet有兩個 Pod,每一個都運行Hello World應用程序。

2. 顯示有關部署的信息:

[root@kubernetes ~]# kubectl get pods

  NAME                 READY     STATUS R      ESTARTS      AGE
  hello-world-2895499144-d99r4    0/1      Running       0          42s
  hello-world-2895499144-v5wkb    1/1      Running       0          2h

 [root@kubernetes ~]# kubectl describe hello-world-2895499144-d99r4

 

 

3.顯示有關ReplicaSet 對象的信息:

[root@kubernetes ~]# kubectl get replicasets
[root@kubernetes ~]# kubectl describe replicasets

 

4. 建立公開部署的Service對象

[root@kubernetes ~]# kubectl expose deployment hello-world --type=NodePort --name=example-server
service "example-server" exposed

 

5.顯示有關服務器的信息

[root@kubernetes ~]# kubectl get service
NAME             CLUSTER-IP       EXTERNAL-IP   PORT(S)     AGE
example-server   10.254.140.175   <nodes>       8080/TCP    45s
kubernetes       10.254.0.1       <none>        443/TCP     2d
nginxserver      10.254.235.210   <none>        11111/TCP   21h

[root@kubernetes ~]# kubectl describe service example-server

Name:      example-server
Namespace:   default
Labels:     run=load-balancer-example
Selector:   run=load-balancer-example
Type:      NodePort
IP:        10.254.140.175
Port:      <unset> 8080/TCP
NodePort:   <unset> 30049/TCP    #自動分配的
Endpoints:  10.0.224.4:8080
Session Affinity: None
No events.

記下服務的NodePort值。例如,在前面的輸出中,NodePort值爲31496。

 http://192.168.20.224:31496

 

6.列出運行Hello world 應用程序的pod

[root@kubernetes ~]# kubectl  get pods --selector="run=load-balancer-example"
NAME                           READY     STATUS             RESTARTS   AGE
hello-world-2895499144-d99r4   0/1       ImagePullBackOff   0          17m
hello-world-2895499144-v5wkb   1/1       Running            0          2h
[root@kubernetes
~]# kubectl get pods --selector="run=load-balancer-example" --output=wide NAME READY STATUS RESTARTS AGE IP NODE hello-world-2895499144-d99r4 0/1 ImagePullBackOff 0 17m 10.0.225.4 192.168.20.225 hello-world-2895499144-v5wkb 1/1 Running 0 2h 10.0.224.4 192.168.20.224

 

7. 使用節點地址和節點端口訪問Hello World應用程序:

curl http://<public-node-ip>:<node-port>

其中<public-node-ip>是您的節點的公共IP地址,<node-port>是您的服務的NodePort值。

[root@kubernetes ~]# curl  192.168.20.224:30049

Hello Kubernetes!

 

8. 刪除服務

[root@kubernetes ~]# kubectl  delete service example-server
service "example-server" deleted

要刪除運行Hello World應用程序的Deployment,ReplicaSet和Pod,請輸入如下命令

  [root@kubernetes ~]# kubectl delete deployment hello-world
  deployment "hello-world" deleted

 

 

公開外部IP地址以訪問集羣中的應用程序

  • 運行Hello World應用程序的五個實例。
  • 建立公開外部IP地址的Service對象。
  • 使用Service對象訪問正在運行的應用程序。

 

建立5個pod 運行的應用程序

[root@kubernetes ~]# kubectl  run hello-world --replicas=5 --labels="run=load-balncer-example" --image=gcr.io/google-samples/node-hello:1.0 --port=8080

顯示有關部署的信息
[root@kubernetes ~]# kubctl get pods
[root@kubernetes ~]# kubectl  describe pods hello-world

顯示有關ReplicaSet對象的信息
[root@kubernetes ~]# kubectl  get  replicasets
[root@kubernetes ~]# kubectl  describe replicasets
[root@kubernetes ~]# kubectl  describe pods hello-world


建立部署的Service對象
[root@kubernetes ~]#  kubectl expose deployment hello-world --type=LoadBalancer --name=my-services

顯示有關服務的信息
[root@kubernetes ~]# kubectl get service
[root@kubernetes ~]# kubectl describe service my-service
 

  [root@kubernetes ~]# kubectl describe  services my-services

 

 

記下服務公開的外部IP地址。在此示例中,外部IP地址爲104.198.205.71。還要注意端口的值。在此示例中,端口爲8080

  

 

 

 使用部署運行無狀態應用程序

 

  • 建立nginx部署。
  • 使用kubectl列出有關部署的信息。
  • 更新部署。

 

建立和探索nginx部署

vim deployment.yaml
apiVersion: extensions
/v1beta1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: docker.cinyi.com:443/nginx:v1.0 ports: - containerPort: 80


[root@kubernetes nginx]# kubectl  create -f deployment.yam
[root@kubernetes nginx]#  kubectl  describe deployment
[root@kubernetes nginx]#  kubectl  describe pods  nginx-deployment
[root@kubernetes nginx]#  kubectl  exec -it nginx-deployment-253806509-bfwxw /bin/bash 


更新部署,更新images

vim depolyment_update.yaml

apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: docker.cinyi.com:443/nginx:v1.1 #更新了鏡像版本 ports: - containerPort: 80
應用新的yaml文件,更新了nginx版本
[root@kubernetes nginx]# kubectl  apply -f deployment_update.yaml  
經過命令查看更新狀況
[root@kubernetes nginx]# kubectl get pods -l app=nginx


 

 
更新部署,更新replica副本數
vim depolyment_replicas.yaml

 
 
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 4 template: metadata: labels: app: nginx spec: containers: - name: nginx image: docker.cinyi.com:443/nginx:v1.1 #更新了鏡像版本 ports: - containerPort: 80
 
 
應用新的yaml文件,更新了nginx版本
[root@kubernetes nginx]# kubectl  apply -f deployment_update.yaml  
 
 
經過命令查看更新狀況
 
 
[root@kubernetes nginx]# kubectl get pods -l app=nginx

刪除部署
 
 
[root@kubernetes nginx]#  kubectl delete deployment nginx-deployment
 

 

 

 

資源管理

許多應用程序須要建立多個資源,例如deployment和service 。經過將多個資源一塊兒分組在同一文件(由---YAML 分隔)中,能夠簡化對多個資源的管理

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80



[root@kubernetes nginx]# kubectl create -f nginx.yaml

[root@kubernetes nginx]# kubectl create -f nginx-1.yaml -f nginx-2.yaml
deployment "nginx-deployment" created
service "my-nginx-svc" created



縮放應用程序


當應用程序的負載增加或縮小時,能夠輕鬆擴展例如,要將nginx副本的數量從3減小到1,請執行如下操做
kubectl
kubectl scale deployment/my-nginx --replicas=1
 

 

 

 

 

 

 

kubernet-dashboard安裝

1.下載dashboard.yaml
kubectl create -f https://rawgit.com/kubernetes/dashboard/master/src/deploy/kubernetes-dashboard.yaml

2.修改yaml文件
image 鏡像從
gcr.io/google_containers/kubernetes-dashboard-amd64:v1.5.1
修改爲: image: docker.cinyi.com:443/kubernetes-dashboard-amd64:v1.5.1

打開註釋,修改爲apiserverIP地址和端口
- --apiserver-host=http://192.168.20.226:8080



配置文件以下:
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  labels:
    app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kubernetes-dashboard
  template:
    metadata:
      labels:
        app: kubernetes-dashboard
      annotations:
        scheduler.alpha.kubernetes.io/tolerations: |
          [
            {
              "key": "dedicated",
              "operator": "Equal",
              "value": "master",
              "effect": "NoSchedule"
            }
          ]
    spec:
      containers:
      - name: kubernetes-dashboard
        image: docker.cinyi.com:443/kubernetes-dashboard-amd64:v1.5.1
        imagePullPolicy: Always
        ports:
        - containerPort: 9090
          protocol: TCP
        args:
           - --apiserver-host=http://192.168.20.226:8080
        livenessProbe:
          httpGet:
            path: /
            port: 9090
          initialDelaySeconds: 30
          timeoutSeconds: 30
---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 9090
  selector:
    app: kubernetes-dashboard


3.執行yaml文件
[root@kubernetes dashboard]#  kubectl create -f kubernetes-dashboard.yaml

4. 使用命令kubectl get pod –all-namespaces查看建立的pod

[root@kubernetes dashboard]#  kubectl get pod --all-namespaces
NAMESPACE     NAME                                   READY     STATUS    RESTARTS   AGE
kube-system   kubernetes-dashboard-277061766-cu9vp   1/1       Running   0          22m


5. 使用describe 查看詳細信息,IP地址,端口等

[root@kubernetes dashboard]# kubectl describe svc kubernetes-dashboard --namespace=kube-system
Name:            kubernetes-dashboard
Namespace:        kube-system
Labels:            app=kubernetes-dashboard
Selector:                app=kubernetes-dashboard
Type:            NodePort
IP:                   10.254.159.33
Port:                   <unset>    80/TCP
NodePort:               <unset>    31457/TCP
Endpoints:               10.0.223.2:9090
Session Affinity:           None
No events.

IP:10.254.159.33 是cluster-ip,外部沒法訪問
Endpoint:10.0.223.2:9090 是docker container IP

若是訪問kubernetes dashboard, 須要訪問nodeport IP 和端口31457
例如 http://192.168.20.223:31457

相關文章
相關標籤/搜索