部署之前先来回顾一下K8s中的核心概念:
◎Replication Controller ,RC
◎Replica Set ,RS
◎Deployment
◎Service
1.创建第一个k8s应用
1.创建一个测试用的deployment
[root@linux-node1 ~]# kubectl run net-test --image=alpine --replicas=2 sleep 360000
deployment.apps "net-test" created
2.查看获取IP情况
[root@linux-node1 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
net-test-5767cb94df-dk28b 1/1 Running 0 2m 10.2.91.2 192.168.56.12
net-test-5767cb94df-fh4vr 1/1 Running 0 2m 10.2.38.2 192.168.56.13
3.测试联通性
[root@linux-node1 ~]# ping -c 2 10.2.38.2
PING 10.2.38.2 (10.2.38.2) 56(84) bytes of data.
64 bytes from 10.2.38.2: icmp_seq=1 ttl=63 time=0.291 ms
64 bytes from 10.2.38.2: icmp_seq=2 ttl=63 time=1.31 ms
2.创建nginx deployment
1.创建一个nginx的deployment
[root@linux-node1 ~]# cat nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.13.12
ports:
- containerPort: 80
[root@linux-node1 ~]# kubectl create -f nginx-deployment.yaml
deployment.apps "nginx-deployment" created
2.查看deployment及详细信息
[root@linux-node1 ~]# kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
net-test 2 2 2 2 7m
nginx-deployment 3 3 3 0 1m
[root@linux-node1 ~]# kubectl describe deployment nginx-deployment
Name: nginx-deployment
Namespace: default
CreationTimestamp: Sun, 23 Sep 2018 22:24:39 +0800
Labels: app=nginx
Annotations: deployment.kubernetes.io/revision=1
Selector: app=nginx
Replicas: 3 desired | 3 updated | 3 total
3.查看pod信息
[root@linux-node1 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
net-test-5767cb94df-dk28b 1/1 Running 0 12m 10.2.91.2 192.168.56.12
net-test-5767cb94df-fh4vr 1/1 Running 0 12m 10.2.38.2 192.168.56.13
nginx-deployment-6c45fc49cb-42sgq 1/1 Running 0 6m 10.2.91.3 192.168.56.12
nginx-deployment-6c45fc49cb-f9sj5 1/1 Running 0 6m 10.2.38.3 192.168.56.13
nginx-deployment-6c45fc49cb-tmgld 1/1 Running 0 6m 10.2.38.4 192.168.56.13
4.访问nginx
[root@linux-node1 ~]# curl --head http://10.2.91.3
HTTP/1.1 200 OK
Server: nginx/1.13.12
Date: Sun, 23 Sep 2018 14:35:05 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Mon, 09 Apr 2018 16:01:09 GMT
Connection: keep-alive
ETag: "5acb8e45-264"
Accept-Ranges: bytes
5.更新deployment,常用于升降级
[root@linux-node1 ~]# kubectl set image deployment/nginx-deployment nginx=nginx:1.12.2 --record
deployment.apps "nginx-deployment" image updated
[root@linux-node1 ~]# kubectl get deployment -o wide
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
net-test 2 2 2 2 20m net-test alpine run=net-test
nginx-deployment 3 4 1 3 14m nginx nginx:1.12.2 app=nginx
#查看版本是否降级
[root@linux-node1 ~]# curl --head http://10.2.91.4
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Sun, 23 Sep 2018 14:41:21 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 11 Jul 2017 13:29:18 GMT
Connection: keep-alive
ETag: "5964d2ae-264"
Accept-Ranges: bytes
#查看回滚记录
[root@linux-node1 ~]# kubectl rollout history deployment/nginx-deployment
deployments "nginx-deployment"
REVISION CHANGE-CAUSE
1 <none>
2 kubectl set image deployment/nginx-deployment nginx=nginx:1.12.2 --record=true
6.快速回滚到上一版本
#查看具体某一个版本的历史
[root@linux-node1 ~]# kubectl rollout history deployment/nginx-deployment --revision=1
deployments "nginx-deployment" with revision #1
Pod Template:
Labels: app=nginx
pod-template-hash=2701970576
Containers:
nginx:
Image: nginx:1.13.12
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
#快速回滚到上一个版本
[root@linux-node1 ~]# kubectl rollout undo deployment/nginx-deployment
deployment.apps "nginx-deployment"
[root@linux-node1 ~]# curl --head http://10.2.38.7
HTTP/1.1 200 OK
Server: nginx/1.13.12
Date: Sun, 23 Sep 2018 14:49:24 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Mon, 09 Apr 2018 16:01:09 GMT
Connection: keep-alive
ETag: "5acb8e45-264"
Accept-Ranges: bytes
Pod的IP每次都会变化,因此我们需要创建一个service,通过VIP来访问。
3.创建nginx service
1.创建一个nginx的service
[root@linux-node1 ~]# cat nginx-service.yaml
kind: Service
apiVersion: v1
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
[root@linux-node1 ~]# kubectl create -f nginx-service.yaml
service "nginx-service" created
2.访问service
[root@linux-node1 ~]# kubectl get service -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 9h <none>
nginx-service ClusterIP 10.1.179.125 <none> 80/TCP 2m app=nginx
#在node2上访问VIP没有问题
[root@linux-node2 ~]# curl --head http://10.1.179.125
HTTP/1.1 200 OK
Server: nginx/1.13.12
Date: Sun, 23 Sep 2018 14:57:21 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Mon, 09 Apr 2018 16:01:09 GMT
Connection: keep-alive
ETag: "5acb8e45-264"
Accept-Ranges: bytes
#通过ipvs转发实现负载均衡
[root@linux-node2 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.1.0.1:443 rr persistent 10800
-> 192.168.56.11:6443 Masq 1 0 0
TCP 10.1.179.125:80 rr
-> 10.2.38.6:80 Masq 1 0 0
-> 10.2.38.7:80 Masq 1 0 0
-> 10.2.91.6:80 Masq 1 0 1
3.快速扩容
[root@linux-node1 ~]# kubectl scale deployment nginx-deployment --replicas 5
deployment.extensions "nginx-deployment" scaled
[root@linux-node1 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
net-test-5767cb94df-dk28b 1/1 Running 0 42m 10.2.91.2 192.168.56.12
net-test-5767cb94df-fh4vr 1/1 Running 0 42m 10.2.38.2 192.168.56.13
nginx-deployment-6c45fc49cb-42mqn 1/1 Running 0 14s 10.2.38.8 192.168.56.13
nginx-deployment-6c45fc49cb-bsr2k 1/1 Running 0 13m 10.2.38.7 192.168.56.13
nginx-deployment-6c45fc49cb-qv9rd 1/1 Running 0 13m 10.2.91.6 192.168.56.12
nginx-deployment-6c45fc49cb-rqn6x 1/1 Running 0 13m 10.2.38.6 192.168.56.13
nginx-deployment-6c45fc49cb-sq4cw 1/1 Running 0 14s 10.2.91.7 192.168.56.12
[root@linux-node2 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.1.0.1:443 rr persistent 10800
-> 192.168.56.11:6443 Masq 1 0 0
TCP 10.1.179.125:80 rr
-> 10.2.38.6:80 Masq 1 0 0
-> 10.2.38.7:80 Masq 1 0 0
-> 10.2.38.8:80 Masq 1 0 0
-> 10.2.91.6:80 Masq 1 0 0
-> 10.2.91.7:80 Masq 1 0 0