k8s基礎入門知識

自動化運維
平臺化(ansible、git、gitlab、docker、jenkins、elk)
自動化(工具/腳本)
容器化(docker/k8s)
虛擬化php

docker和虛擬機的區別
更高效的資源利用。虛擬機是一個完備的系統,容器只是一個進程。html

虛擬機啓動慢,容器是秒級
一致的運行環境
CI/CD
容器核心概念
鏡像Image
(1)鏡像是一個特殊的文件系統。它除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(例如環境變量)。鏡像不包含任何動態數據,其內容在構建以後也不會被改變。
(2)鏡像採用的是AUFS,實現分層結構。鏡像構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生改變,後一層上的任何改變只發生在本身這一層。鏡像是隻讀的。建立新鏡像時,底層內容不變,只是給鏡像增長了一個新層次。
容器Container
(1)容器能夠認爲是鏡像的一次執行,是可讀寫的鏡像。容器只是操做系統上的一個進程,進程執行完畢將會退出。不要假定容器會一直存在,應該假設它隨時會崩潰。容器一旦出現故障,不要猶豫,直接將它刪除,再啓動一個。
(2)按照 Docker 最佳實踐的要求,容器不該該向其存儲層內寫入任何數據,容器存儲層要保持無狀態化。全部的文件寫入操做,都應該使用 數據卷(Volume)、或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。數據卷的生存週期獨立於容器,容器消亡,數據卷不會消亡。
倉庫Repository
倉庫是鏡像倉庫,負責對Docker鏡像進行管理的(相似倉庫管理員),每一個倉庫能夠包含多個標籤(Tag),每一個標籤對應一個鏡像。也能夠本身建立私有倉庫。
k8s組成
這個集羣主要包括兩個部分:
一個Master節點(主節點):用於對容器進行控制、調度,通常是物理服務器,
一羣Node節點(計算節點):工做負載節點,裏面是具體的容器,能夠是物理服務器,也能夠是雲主機前端

補充:
Pod是Kubernetes最基本的操做單元。一個Pod表明着集羣中運行的一個進程,它內部封裝了一個或多個緊密相關的容器。除了Pod以外,K8S還有一個Service的概念,一個Service能夠看做一組提供相同服務的Pod的對外訪問接口。node

k8s架構圖mysql

k8s工做流程圖簡述linux

k8s配置及簡單應用
一、做爲master安裝k8s(node11:192.168.4.11),同時做爲node節點安裝docker
二、修改docker配置文件,使之可使用物理機上的私有鏡像倉庫git

[root@node11 k8s_pkgs]# vim /etc/sysconfig/docker
OPTIONS='--selinux-enabled=false ... //關閉selinux
[root@node11 k8s_pkgs]# vim /etc/docker/daemon.json
{web

"insecure-registries": ["192.168.4.254:5000"]

}redis

[root@room9pc01 images]# docker images //物理機(192.168.4.254)搭建私有鏡像倉庫以下
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.8.254:5000/mysql latest 7bb2586065cd 10 weeks ago 476.9 MB
192.168.8.254:5000/pod-infrastructure latest 99965fb98423 19 months ago 208.6 MB
192.168.8.254:5000/guestbook-php-frontend latest 47ee16830e89 2 years ago 510 MB
192.168.8.254:5000/tomcat-app latest a29e200a18e9 2 years ago 358.2 MB
192.168.8.254:5000/redis-master latest 405a0b586f7e 3 years ago 419.1 MB
192.168.8.254:5000/guestbook-redis-slave latest e0c36a1fa372 3 years ago 109.5 MB
1
三、啓動相關服務
k8s—master:
etcd:是一個數據庫,保存了整個集羣的狀態
kube-apiserver:執行指令,提供了資源操做的惟一入口,並提供認證、受權、訪問控制、API註冊和發現等機制
kube-controller-manager:外匯專業術語www.gendan5.com/terminology.html 控制管理器,負責維護集羣的狀態,好比故障檢測、自動擴展、滾動更新等
kube-scheduler:負責資源的調度,按照預約的調度策略將Pod調度到相應的機器上sql

k8s—node:
kubelet:接受指令的node節點(k8s客戶端),負責維護容器的生命週期,同時也負責Volume(CVI)和網絡(CNI)的管理
kube-proxy:代理節點,負責爲Service提供cluster內部的服務發現和負載均衡
docker:真正的容器服務,負責鏡像管理以及Pod和容器的真正運行

[root@node11 k8s_pkgs]# rpm -q docker
docker-1.13.1-91.git07f3374.el7.centos.x86_64

master的組件

[root@node11 kubernetes]# systemctl start etcd
[root@node11 kubernetes]# systemctl enable etcd
[root@node11 k8s_pkgs]# systemctl start kube-apiserver.service
[root@node11 k8s_pkgs]# systemctl enable kube-apiserver.service
[root@node11 k8s_pkgs]# systemctl start kube-controller-manager.service
[root@node11 k8s_pkgs]# systemctl enable kube-controller-manager.service
[root@node11 k8s_pkgs]# systemctl start kube-scheduler.service
[root@node11 k8s_pkgs]# systemctl enable kube-scheduler.service

node的組件

[root@node11 k8s_pkgs]# systemctl start docker
[root@node11 k8s_pkgs]# systemctl enable docker
[root@node11 k8s_pkgs]# systemctl start kubelet.service
[root@node11 k8s_pkgs]# systemctl enable kubelet.service
[root@node11 k8s_pkgs]# systemctl start kube-proxy.service
[root@node11 k8s_pkgs]# systemctl enable kube-proxy.service

四、修改配置,重啓服務

[root@node11 k8s_pkgs]# ls /etc/kubernetes/
apiserver config controller-manager kubelet proxy scheduler
[root@node11 k8s_pkgs]# vim /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" //容許任何主機都可以訪問本機
把ServiceAccount從KUBE_ADMISSION_CONTROL中刪除 //刪除服務賬號
[root@node11 k8s_pkgs]# systemctl restart kube-apiserver.service
[root@node11 k8s_pkgs]# vim /etc/kubernetes/config
KUBE_MASTER="--master=http://192.168.4.11:8080" //指定master的ip地址
[root@node11 k8s_pkgs]# vim /etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=0.0.0.0" //定義客戶端運行在全部地址上,便於master遠程管理
KUBELET_API_SERVER="--api-servers=http://192.168.4.11:8080" //客戶端指定服務器地址和ip
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=192.168.4.254:5000/pod-infrastructure" //指定pod(容器組)的私有鏡像倉庫
[root@node11 k8s_pkgs]# systemctl restart kubelet

五、應用測試tomcat+mysql

[root@node11 tomcat_mysql]# vim mysql-rc.yaml /建立mysql的rc聲明文件
apiVersion: v1
kind: ReplicationController //類型聲明
metadata:
name: mysql //rc名稱
spec: //文件聲明
replicas: 1 //要求標籤是app:mysql的pod數目是1
selector: //選擇器,查找標籤是app:mysql的pod

app: mysql

template: //若是pod數目不達標,建立知足如下條件的pod

metadata:
  labels:
    app: mysql
spec:
  containers:
  - name: mysql
    image: 192.168.4.254:5000/mysql        //私有鏡像倉庫
    ports:
    - containerPort: 3306
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "123456"

根據yaml文件建立相關資源

[root@node11 tomcat_mysql]# kubectl create -f mysql-rc.yaml //啓動一個名稱爲mysql的rc容器
[root@node11 tomcat_mysql]# kubectl get rc //獲取容器信息
NAME DESIRED CURRENT READY AGE
mysql 1 1 1 1h
[root@node11 tomcat_mysql]# kubectl get pod //該pod容器組包含一個基礎架構容器和mysql容器
NAME READY STATUS RESTARTS AGE
mysql-v0pdr 1/1 Running 0 1h

查看到pod後,查看其詳細消息

[root@node11 tomcat_mysql]# kubectl describe pod mysql-v0pdr //查看pod信息
[root@node11 tomcat_mysql]# docker ps

建立mysql服務

[root@node11 tomcat_mysql]# vim mysql-svc.yaml //啓動mysql容器服務腳本
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:

- port: 3306

selector:

app: mysql

[root@node11 tomcat_mysql]# kubectl create -f mysql-svc.yaml //啓動mysql容器的mysql服務
[root@node11 tomcat_mysql]# kubectl get services //查看啓動的服務
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 <none> 443/TCP 4h
mysql 10.254.164.241 <none> 3306/TCP 7m

mysql服務沒有EXTERNAL-IP,由於用戶不直接訪問mysql,而是訪問web服務

建立web服務

[root@node11 tomcat_mysql]# vim myweb-rc.yaml //啓動comcat容器腳本
kind: ReplicationController
metadata:
name: myweb
spec:
replicas: 5 //副本個數
selector:

app: myweb

template:

metadata:
  labels:
    app: myweb
spec:
  containers:
    - name: myweb
      image: 192.168.4.254:5000/tomcat-app        //私有倉庫鏡像
      ports:
      - containerPort: 8080
      env:
      - name: MYSQL_SERVICE_HOST        //鏈接mysql容器
        value: 'mysql'
      - name: MYSQL_SERVICE_PORT
        value: '3306'

[root@node11 tomcat_mysql]# kubectl create -f myweb-rc.yaml
[root@node11 tomcat_mysql]# kubectl get rc
NAME DESIRED CURRENT READY AGE
mysql 1 1 1 2h
myweb 5 5 5 35s
[root@node11 tomcat_mysql]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-v0pdr 1/1 Running 0 2h
myweb-jsb1k 1/1 Running 0 47s
myweb-kl2gk 1/1 Running 0 47s
myweb-l1qvq 1/1 Running 0 47s
myweb-p0n7g 1/1 Running 0 47s
myweb-sh6jl 1/1 Running 0 47s
[root@node11 tomcat_mysql]# vim myweb-svc.yaml //myweb服務腳本
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort
ports:

- port: 8080            //如下兩行表示訪問node的30001,將會映射到pod的8080
  nodePort: 30001

selector:

app: myweb

[root@node11 tomcat_mysql]# kubectl create -f myweb-svc.yaml //啓動myweb服務
[root@node11 tomcat_mysql]# kubectl get service
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 <none> 443/TCP 4h
mysql 10.254.164.241 <none> 3306/TCP 30m
myweb 10.254.222.24 <nodes> 8080:30001/TCP 26s
[root@node11 tomcat_mysql]# docker ps |awk '{print $2}'
ID
192.168.4.254:5000/tomcat-app
192.168.4.254:5000/tomcat-app
192.168.4.254:5000/tomcat-app
192.168.4.254:5000/tomcat-app
192.168.4.254:5000/tomcat-app
192.168.4.254:5000/pod-infrastructure //myweb基礎架構容器
192.168.4.254:5000/pod-infrastructure
192.168.4.254:5000/pod-infrastructure
192.168.4.254:5000/pod-infrastructure
192.168.4.254:5000/pod-infrastructure
192.168.4.254:5000/mysql
192.168.4.254:5000/pod-infrastructure //mysql基礎架構容器

myweb將啓動5個pod和10個容器,由於每一個pod須要有一個基礎架構容器,還須要有一個工做容器,同理mysql也會啓動1個pod和一個容器

瀏覽器訪問http://192.168.4.11:30001/
刪除一個容器後,k8s會發現容器數目已經少於rc聲明,它會自動建立新的對應容器

[root@node11 tomcat_mysql]# docker rm -f c1bf3822f088
[root@node11 tomcat_mysql]# docker ps
1
2
若是想要動態調整pod數目,只是將rc改個數便可

[root@node11 tomcat_mysql]# kubectl scale --replicas=3 replicationcontroller myweb //將myweb容器個數調整爲3個
[root@node11 tomcat_mysql]# kubectl get rc
NAME DESIRED CURRENT READY AGE
mysql 1 1 1 1h
myweb 3 3 3 36m
[root@node11 tomcat_mysql]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mysql-hg9z0 1/1 Running 0 58m
myweb-3g6rz 1/1 Running 0 32m
myweb-90jts 1/1 Running 0 32m
myweb-rvrr1 1/1 Running 0 32m
[root@node11 tomcat_mysql]# docker ps -a |awk '{print $2}' //docker個數也自動調整
ID
192.168.4.254:5000/tomcat-app
192.168.4.254:5000/tomcat-app
192.168.4.254:5000/tomcat-app
192.168.4.254:5000/pod-infrastructure
192.168.4.254:5000/pod-infrastructure
192.168.4.254:5000/pod-infrastructure
192.168.4.254:5000/mysql
192.168.4.254:5000/pod-infrastructure

刪除服務(pod也稱微服務)、rc

[root@node11 tomcat_mysql]# kubectl delete service mysql
service "mysql" deleted
[root@node11 tomcat_mysql]# kubectl delete service myweb
service "myweb" deleted
[root@node11 tomcat_mysql]# kubectl delete rc mysql
replicationcontroller "mysql" deleted
[root@node11 tomcat_mysql]# kubectl delete rc myweb
replicationcontroller "myweb" deleted
[root@node11 tomcat_mysql]# docker ps //無容器運行

php-redis主從

redis-master

[root@node11 php_redis]# ls
frontend-controller.yaml redis-master-controller.yaml redis-slave-controller.yaml
frontend-service.yaml redis-master-service.yaml redis-slave-service.yaml
[root@node11 php_redis]# vim redis-master-controller.yaml
piVersion: v1
kind: ReplicationController
metadata:
name: redis-master
labels:

name: redis-master

spec:
replicas: 1
selector:

name: redis-master

template:

metadata:
  labels:
    name: redis-master
spec:
  containers:
  - name: master
    image: 192.168.4.254:5000/redis-master
    ports:
    - containerPort: 6379

[root@node11 php_redis]# kubectl create -f redis-master-controller.yaml
[root@node11 php_redis]# vim redis-master-service.yaml
apiVersion: v1
kind: Service
metadata:
name: redis-master
labels:

name: redis-master

spec:
ports:

  • port: 6379
    targetPort: 6379

selector:

name: redis-master

[root@node11 php_redis]# kubectl create -f redis-master-service.yaml

redis-slave

[root@node11 php_redis]# vim redis-slave-controller.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: redis-slave
labels:

name: redis-slave

spec:
replicas: 2
selector:

name: redis-slave

template:

metadata:
  labels:
    name: redis-slave
spec:
  containers:
  - name: slave
    image: 192.168.4.254:5000/guestbook-redis-slave
    env:
    - name: GET_HOSTS_FORM
      value: env
    ports:
    - containerPort: 6379

[root@node11 php_redis]# vim redis-slave-service.yaml
apiVersion: v1
kind: Service
metadata:
name: redis-slave
labels:

name: redis-slave

spec:
ports:

  • port: 6379

selector:

name: redis-slave

[root@node11 php_redis]# kubectl create -f redis-slave-service.yaml
[root@node11 php_redis]# kubectl get rc
NAME DESIRED CURRENT READY AGE
redis-master 1 1 1 9m
redis-slave 2 2 2 1m
[root@node11 php_redis]# kubectl get pod
NAME READY STATUS RESTARTS AGE
redis-master-cn208 1/1 Running 0 9m
redis-slave-dctvw 1/1 Running 0 1m
redis-slave-gxtfs 1/1 Running 0 1m
[root@node11 php_redis]# kubectl get service
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 <none> 443/TCP 9h
redis-master 10.254.174.239 <none> 6379/TCP 8m
redis-slave 10.254.117.213 <none> 6379/TCP 42s

frontend(前端)

[root@node11 php_redis]# vim frontend-controller.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: frontend
labels:

name: frontend

spec:
replicas: 3
selector:

name: frontend

template:

metadata:
  labels:
    name: frontend
spec:
  containers:
  - name: frontend
    image: 192.168.4.254:5000/guestbook-php-frontend
    env:
    - name: GET_HOSTS_FROM
      value: env
    ports:
      - containerPort: 80
      -

[root@node11 php_redis]# kubectl create -f frontend-controller.yaml
[root@node11 php_redis]# vim frontend-service.yaml
apiVersion: v1
kind: Service
metadata:
name: frontend
labels:

name: frontend

spec:
type: NodePort
ports:

  • port: 80
    nodePort: 30001

selector:

name: frontend

[root@node11 php_redis]# kubectl create -f frontend-service.yaml
[root@node11 php_redis]# kubectl get rc
NAME DESIRED CURRENT READY AGE
frontend 3 3 3 2m
redis-master 1 1 1 14m
redis-slave 2 2 2 6m
[root@node11 php_redis]# kubectl get pod
NAME READY STATUS RESTARTS AGE
frontend-3dqhv 1/1 Running 0 2m
frontend-ct7qw 1/1 Running 0 2m
frontend-tz3p4 1/1 Running 0 2m
redis-master-cn208 1/1 Running 0 14m
redis-slave-dctvw 1/1 Running 0 6m
redis-slave-gxtfs 1/1 Running 0 6m
[root@node11 php_redis]# kubectl get service
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
frontend 10.254.210.184 <nodes> 80:30001/TCP 42s
kubernetes 10.254.0.1 <none> 443/TCP 9h
redis-master 10.254.174.239 <none> 6379/TCP 13m
redis-slave 10.254.117.213 <none> 6379/TCP 5m

瀏覽器訪問http://192.168.4.11:30001/,測試redis主從讀寫分離

相關文章
相關標籤/搜索