01_K8S啟動容器實戰
K8S啟動容器有多種方式:
Pod為單位:一個或多個容器
ReplicationController方式,能夠保證容器的數量
Deployment方式,能夠保證容器的數量,並能簡易的實現升級部署
鏡像倉庫:
[root@master ~]# docker pull hub-mirror.c.163.com/library/registry
[root@master ~]# docker run -d --net=host -v /usr/local/registry/data/:/var/lib/registry hub-mirror.c.163.com/library/registry
配置使用http的方式:
# cat /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com/","http://10.0.0.230"],
"insecure-registries":["http://10.0.0.230"]
}
Kubernetes啟動容器:create.yml
[root@master ~]# cat create.yml
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 2
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: mynginx
imagePullPolicy: Always
image: 10.0.0.230/shijiange/shijiange:nginx
Node關於鏡像的下載策略:
1.Always:每次都下載最新的鏡像
2.IfNotPresent:當本地沒有的時候去下載鏡像
3.Never:只使用本地鏡像,從不下載
K8S創建容器和查看容器:
1.kubectl --server=192.168.237.50:8080 create -f create.yml
2.kubectl --server=192.168.237.50:8080 get rc
3.kubectl --server=192.168.237.50:8080 get pods
4.kubectl --server=192.168.237.50:8080 describe pod nginx
5.kubectl --server=192.168.237.50:8080 delete rc nginx
[root@master ~]# kubectl create -f create.yml
replicationcontroller/nginx created
[root@master ~]# kubectl get rc
NAME DESIRED CURRENT READY AGE
nginx 2 2 0 50s
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-9dvrp 0/1 ContainerCreating 0 96s
nginx-g2hhm 0/1 ContainerCreating 0 96s
[root@master ~]# kubectl describe pod nginx-9dvrp
Warning FailedCreatePodSandBox 4m22s (x397 over 5h20m) kubelet, node1 Failed create pod sandbox: rpc error: code = Unknown desc = failed pulling image "k8s.gcr.io/pause:3.1": Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
一開始用K8S創建容器會有問題:
kubelet依賴pause這個基礎鏡像k8s.gcr.io/pause:3.1,master和node節點都找到pause鏡像並tag
# docker search pause
# docker pull kubernetes/pause
# docker tag kubernetes/pause k8s.gcr.io/pause:3.1
# docker images|grep pause
kubernetes/pause latest f9d5de079539 5 years ago 240kB
k8s.gcr.io/pause 3.1 f9d5de079539 5 years ago 240kB
查看:
[root@node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
491237c68e82 k8s.gcr.io/pause:3.1 "/pause" 3 minutes ago Up 3 minutes k8s_POD_nginx-g2hhm_default_001af498-8a87-11ea-b3f3-000c290f6f2b_0
746423191a83 k8s.gcr.io/pause:3.1 "/pause" 3 minutes ago Up 3 minutes k8s_POD_nginx-9dvrp_default_00190c23-8a87-11ea-b3f3-000c290f6f2b_0
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-9dvrp 1/1 Running 0 5h39m
nginx-g2hhm 1/1 Running 0 5h39m
[root@node1 ~]# docker ps -a #兩個nginx容器都跑到node上
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
476163d02abc 10.0.0.230/shijiange/shijiange "sjgrun" About a minute ago Up About a minute k8s_mynginx_nginx-g2hhm_default_001af498-8a87-11ea-b3f3-000c290f6f2b_0
3880616b2b99 10.0.0.230/shijiange/shijiange "sjgrun" About a minute ago Up About a minute k8s_mynginx_nginx-9dvrp_default_00190c23-8a87-11ea-b3f3-000c290f6f2b_0
491237c68e82 k8s.gcr.io/pause:3.1 "/pause" 7 minutes ago Up 7 minutes k8s_POD_nginx-g2hhm_default_001af498-8a87-11ea-b3f3-000c290f6f2b_0
746423191a83 k8s.gcr.io/pause:3.1 "/pause" 7 minutes ago Up 7 minutes k8s_POD_nginx-9dvrp_default_00190c23-8a87-11ea-b3f3-000c290f6f2b_0
測試nginx:
[root@node1 ~]# docker exec -it 476163d02abc bash
[root@nginx-g2hhm /]# curl 127.0.0.1
附:pause推到自己的鏡像倉庫備用:
[root@master ~]# docker tag k8s.gcr.io/pause:3.1 10.0.0.230/shijiange/pause:3.1
[root@master ~]# docker push 10.0.0.230/shijiange/pause:3.1
-------------------------------------
02_K8S容器的高可用和伸縮實戰
K8s的ReplicationController相對於普通容器的優點:
1. 保證容器的數量
2. 能夠實現彈性伸縮
容器數量的保證:
1. 移除容器docker rm -f
2. 移除后觀察容器,會自動啟動容器
彈性伸縮:
可以指定容器的數量,會啟動多個
網絡沒有沖突的話,可以在一台Node上啟動多個一樣的容器
[root@master ~]# kubectl scale rc nginx --replicas=3
[root@master ~]# kubectl get rc
NAME DESIRED CURRENT READY AGE
nginx 3 3 3 5h53m
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-9dvrp 1/1 Running 0 5h53m
nginx-g2hhm 1/1 Running 0 5h53m
nginx-zbt4h 1/1 Running 0 29s
刪除rc:
[root@master ~]# kubectl delete -f create.yml
[root@master ~]# kubectl delete rc nginx
-------------------------------------
03_K8S的Pod概念實戰講解
K8S POD說明
1. Node是啟動容器的資源,Pod是實際運行的實例
2. 一個Pod -> 多個容器(不會拆分運行)
K8S啟動多個容器create.yml
[root@master ~]# cat create.yml
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx-redis
spec:
replicas: 1
template:
metadata:
name: nginx-redis
labels:
app: nginx-redis
spec:
containers:
- name: mynginx
imagePullPolicy: Always
image: 10.0.0.230:5000/shijiange:nginx
- name: myredis
imagePullPolicy: Always
image: 10.0.0.230:5000/shijiange:redis
啟動容器:
# kubectl --server=xxx:8080 create -f create.yml
[root@master ~]# kubectl create -f create.yml
觀察一個Pod,是有跑着兩個容器,是在同一個Node(但是在隨機node上,即隨機宿主機):
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-redis-76t7w 2/2 Running 0 46s
[root@node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTSNAMES
f29d016fda36 10.0.0.230/shijiange/shijiange "sjgrun" 15 seconds ago Up 14 secondsk8s_myredis_nginx-redis-76t7w_default_ad98481f-8aba-11ea-9cdf-000c290f6f2b_0
1e73bd7922f7 10.0.0.230/shijiange/shijiange "sjgrun" 34 seconds ago Up 33 secondsk8s_mynginx_nginx-redis-76t7w_default_ad98481f-8aba-11ea-9cdf-000c290f6f2b_0
d81159865c65 k8s.gcr.io/pause:3.1 "/pause" 35 seconds ago Up 33 secondsk8s_POD_nginx-redis-76t7w_default_ad98481f-8aba-11ea-9cdf-000c290f6f2b_0
---------------------------------------
04_K8S把Pod分配到指定Node
K8s默認分配Pod:
K8s默認分配Pod到Node是比較隨機的,會挑比較空的分配
可以通過配置把Pod分配到指定的Node
給Node添加標識:
# kubectl --server=192.168.237.50:8080 get node
# kubectl --server=192.168.237.50:8080 label nodes xxx apptype=nginx
# kubectl --server=192.168.237.50:8080 get nodes --show-labels
[root@master ~]# kubectl label nodes master apptype=nginx
error: 'apptype' already has a value (nginx), and --overwrite is false
[root@master ~]# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
master NotReady <none> 18h v1.13.12 apptype=nginx,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=master
node1 Ready <none> 18h v1.13.12 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=node1
分配Pod到指定Node(這里的master節點):
[root@master ~]# cat create.yml
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx-redis
spec:
replicas: 1
template:
metadata:
name: nginx-redis
labels:
app: nginx-redis
spec:
containers:
- name: mynginx
imagePullPolicy: Always
image: 10.0.0.230/shijiange/shijiange:nginx
- name: myredis
imagePullPolicy: Always
image: 10.0.0.230/shijiange/shijiange:redis
nodeSelector:
apptype: nginx
[root@master ~]# kubectl create -f create.yml
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-redis-rlffj 2/2 Running 0 74s
[root@master ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d4ae53cffcb1 10.0.0.230/shijiange/shijiange "sjgrun" 10 seconds ago Up 10 seconds k8s_myredis_nginx-redis-rlffj_default_3c2b51d6-8abd-11ea-9cdf-000c290f6f2b_0
55f70e8440e6 10.0.0.230/shijiange/shijiange "sjgrun" 11 seconds ago Up 10 seconds k8s_mynginx_nginx-redis-rlffj_default_3c2b51d6-8abd-11ea-9cdf-000c290f6f2b_0
731a416ec778 k8s.gcr.io/pause:3.1 "/pause" 13 seconds ago Up 11 seconds k8s_POD_nginx-redis-rlffj_default_3c2b51d6-8abd-11ea-9cdf-000c290f6f2b_0