kubernetes(k8s)-安裝(二)
什麼是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組件
192.168.20.226 kubernetes,etcd master
192.168.20.225 10.0.225.1/24 kubernetes,docker,openvswith node
192.168.20.224 10.0.224.1/24 kubernetes,docker,openvswith node
192.168.20.223 10.0.223.1/24 kubernetes,docker,openvswith node
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
master:
yum -y install kubernetes etcd
----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配置文件/etc/etcd/etcd.conf
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節點配置
[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
[root@master ~] # kubectl describe 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詳細信息
kubectl describe pods cpu-ramdemo
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對象訪問正在運行的應用程序。