Kubernetes是一個開源平臺,用於跨主機羣集自動部署,擴展和操做應用程序容器,提供以容器爲中心的基礎架構。html
使用Kubernetes,您能夠快速高效地響應客戶需求:node
咱們的目標是創建一個組件和工具的生態系統,以減輕在公共雲和私有云中運行應用程序的負擔。nginx
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: {}
目的
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
建立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部署
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