什么是Kubernetes
Kubernetes是一個開源平台,用於跨主機群集自動部署,擴展和操作應用程序容器,提供以容器為中心的基礎架構。
使用Kubernetes,您可以快速高效地響應客戶需求:
- 快速,可預測地部署應用程序。
- 在運行中擴展應用程序。
- 無縫推出新功能。
- 僅使用您需要的資源來優化硬件的使用。
我們的目標是建立一個組件和工具的生態系統,以減輕在公共雲和私有雲中運行應用程序的負擔。
Kubernetes是:
Kubernetes是Google開源的容器集群管理系統,實現基於Docker構建容器,利用Kubernetes能很方面管理多台Docker主機中的容器。
主要功能如下:
1)將多台Docker主機抽象為一個資源,以集群方式管理容器,包括任務調度、資源管理、彈性伸縮、滾動升級等功能。
2)使用編排系統(YAML File)快速構建容器集群,提供負載均衡,解決容器直接關聯及通信問題
3)自動管理和修復容器,簡單說,比如創建一個集群,里面有十個容器,如果某個容器異常關閉,那么,會嘗試重啟或重新分配容器,始終保證會有十個容器在運行,反而殺死多余的。
kubernetes角色組成:
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
二、定義容器的命令和參數 創建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環境變量值為

三、想容器分配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詳細信息
四、配置單元以將卷用於存儲 容器的文件系統只存在於容器中,因此當容器終止並重新啟動時,文件系統的更改將丟失。對於獨立於容器的更一致的存儲,您可以使用 卷。這對於狀態應用程序(例如鍵值存儲和數據庫)尤其重要。例如,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
縮放應用程序
當應用程序的負載增長或縮小時,可以輕松擴展kubectl
。例如,要將nginx副本的數量從3減少到1,請執行以下操作
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
