0.把kubernetes的环境先跑起来并确认状态。
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master.example.com Ready master 5h v1.11.1
node1.example.com Ready <none> 4h v1.11.1
node2.example.com Ready <none> 23s v1.11.1
1.启动一个deployment应用控制的程序nginx-deploy。
[root@master ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 --dry-run=true
deployment.apps/nginx-deploy created (dry run)
[root@master ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1
deployment.apps/nginx-deploy created
[root@master ~]# kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deploy 1 1 1 0 20s
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deploy-5b595999-n75ds 1/1 Running 0 32m
[root@master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-deploy-5b595999-n75ds 1/1 Running 0 32m 10.244.2.2 node2.example.com
2.到node2.example.com上查看硬件接口配置信息,发现使用的是cni0网卡配置的网段。尝试用curl进行访问。注意:这里只能在集群内部进行访问,集群外目前是无法访问的。
[root@node2 ~]# ifconfig
cni0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450
inet 10.244.2.1 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::9850:b4ff:fec4:a770 prefixlen 64 scopeid 0x20<link>
ether 0a:58:0a:f4:02:01 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 648 (648.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@node1 ~]# curl 10.244.2.2
3.我们尝试把已经建立的pod删除。可以看到,因为设置了replicas=1,pod在被删除后,会重新自动生成一个。不过新的pod运行的节点不同,这次是node1.example.com。
[root@master ~]# kubectl delete pods nginx-deploy-5b595999-n75ds
pod "nginx-deploy-5b595999-n75ds" deleted
[root@master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-deploy-5b595999-x52rk 1/1 Running 0 2m 10.244.1.2 node1.example.com
4.把deployment应用管理的nginx-deploy作为service发布出来,--name=nginx指明名称,--port=80指明service端口,--target-port=80指明pod端口,--protocol=TCP指明访问协议。通过kubectl get svc查看确认。这时,在集群内部的节点之间是可以访问的,但是集群之外是无法访问的。
[root@master ~]# kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP
service/nginx exposed
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6h
nginx ClusterIP 10.102.51.215 <none> 80/TCP 15s
[root@node2 ~]# curl 10.102.51.215
5.kube-system空间中运行着两个coredns的pod,kube-system的services信息可以看到ClusterIP。或者运行一个client容器, --image=busybox指明镜像,--replicas=1指明pod数量,-it 指明进入交互界面,--restart=Never指明pod关闭后不再重新生成。cat /etc/resolv.conf查看地址解析,default.svc.cluster.local中的default是域名空间名称。
[root@master ~]# kubectl get pods -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE
coredns-78fcdf6894-pzvc6 1/1 Running 0 6h 10.244.0.6 master.example.com
coredns-78fcdf6894-tg7zs 1/1 Running 0 6h 10.244.0.7 master.example.com
[root@master ~]# kubectl get svc -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 6h
[root@master ~]# yum install bind-utils
[root@master ~]# kubectl run client --image=busybox --replicas=1 -it --restart=Never
If you don't see a command prompt, try pressing enter.
/ # cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local localdomain example.com
options ndots:5
/ # wget nginx
Connecting to nginx (10.102.51.215:80)
index.html 100% |************************************************************************************************| 612 0:00:00 ETA
/ # wget -O - -q http://nginx:80/
[root@master ~]# dig -t A nginx.default.svc.cluster.local @10.96.0.10
;; QUESTION SECTION:
;nginx.default.svc.cluster.local. IN A
;; ANSWER SECTION:
nginx.default.svc.cluster.local. 5 IN A 10.102.51.215
6.这时我们尝试将pod删除,系统会自动重新生成一个pod,我们在之前的交互界面继续尝试访问nginx,依然可以访问。
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
client 1/1 Running 0 17m
nginx-deploy-5b595999-x52rk 1/1 Running 0 47m
[root@master ~]# kubectl delete pods nginx-deploy-5b595999-x52rk
pod "nginx-deploy-5b595999-x52rk" deleted
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
client 1/1 Running 0 17m
nginx-deploy-5b595999-tj8ms 1/1 Running 0 24s
/ # wget -O - -q http://nginx:80/
7.kubectl describe svc nginx查看服务详细信息,Endpoints表示的容器变化时,会通过Selector: run=nginx-deploy自动去关联新生成的pod。 kubectl get pods --show-labels可以查看pod的标签信息。我们将nginx服务删除,然后再次发布,在之前的交互端口依然可以访问nginx。通过kubectl describe deployment nginx-deploy也能显示标签信息Labels: run=nginx-deploy。
[root@master ~]# kubectl describe svc nginx
Name: nginx
Namespace: default
Labels: run=nginx-deploy
Annotations: <none>
Selector: run=nginx-deploy
Type: ClusterIP
IP: 10.102.51.215
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.1.3:80
Session Affinity: None
Events: <none>
[root@master ~]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
client 1/1 Running 0 23m run=client
nginx-deploy-5b595999-tj8ms 1/1 Running 0 5m pod-template-hash=16151555,run=nginx-deploy
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7h
nginx ClusterIP 10.102.51.215 <none> 80/TCP 41m
[root@master ~]# kubectl delete svc nginx
service "nginx" deleted
[root@master ~]# kubectl expose deployment nginx-deploy --name=nginx
service/nginx exposed
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7h
nginx ClusterIP 10.101.146.21 <none> 80/TCP 11s
/ # wget -O - -q http://nginx:80/
[root@master ~]# kubectl describe deployment nginx-deploy
Name: nginx-deploy
Namespace: default
CreationTimestamp: Fri, 07 Dec 2018 03:14:33 -0500
Labels: run=nginx-deploy
Annotations: deployment.kubernetes.io/revision=1
Selector: run=nginx-deploy
Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: run=nginx-deploy
Containers:
nginx-deploy:
Image: nginx:1.14-alpine
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Progressing True NewReplicaSetAvailable
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-deploy-5b595999 (1/1 replicas created)
Events: <none>
8.kubectl run myapp起一个deployment,--image=ikubernetes/myapp:v1 --replicas=2指明镜像和pod数量,可以在之前的交互终端对pod的地址进行访问。将deployment发布service为myapp,可以对service进行访问。
[root@master ~]# kubectl run myapp --image=ikubernetes/myapp:v1 --replicas=2
deployment.apps/myapp created
[root@master ~]# kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
myapp 2 2 2 1 1m
nginx-deploy 1 1 1 1 1h
[root@master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
client 1/1 Running 0 49m 10.244.2.3 node2.example.com
myapp-848b5b879b-hgww4 1/1 Running 0 2m 10.244.2.5 node2.example.com
myapp-848b5b879b-th7kc 1/1 Running 0 2m 10.244.1.5 node1.example.com
nginx-deploy-5b595999-tj8ms 1/1 Running 0 31m 10.244.1.3 node1.example.com
/ # wget -O - -q 10.244.1.5
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
/ # wget -O - -q 10.244.2.5
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
/ # wget -O - -q 10.244.1.5/hostname.html
myapp-848b5b879b-th7kc
/ # wget -O - -q 10.244.2.5/hostname.html
myapp-848b5b879b-hgww4
[root@master ~]# kubectl expose deployment myapp --name=myapp --port=80
service/myapp exposed
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7h
myapp ClusterIP 10.99.24.155 <none> 80/TCP 8s
nginx ClusterIP 10.101.146.21 <none> 80/TCP 23m
/ # wget -O - -q myapp/hostname.html
myapp-848b5b879b-hgww4
/ # wget -O - -q myapp/hostname.html
myapp-848b5b879b-th7kc
9.可以通过kubectl scale --replicas=对deployment的pod进行动态扩容和缩容。
[root@master ~]# kubectl scale --replicas=5 deployment myapp
deployment.extensions/myapp scaled
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
client 1/1 Running 0 1h
myapp-848b5b879b-757ng 1/1 Running 0 21s
myapp-848b5b879b-hgww4 1/1 Running 0 13m
myapp-848b5b879b-lq9q5 1/1 Running 0 21s
myapp-848b5b879b-m22vb 1/1 Running 0 21s
myapp-848b5b879b-th7kc 1/1 Running 0 13m
nginx-deploy-5b595999-tj8ms 1/1 Running 0 43m
[root@master ~]# kubectl scale --replicas=3 deployment myapp
deployment.extensions/myapp scaled
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
client 1/1 Running 0 1h
myapp-848b5b879b-757ng 1/1 Running 0 1m
myapp-848b5b879b-hgww4 1/1 Running 0 14m
myapp-848b5b879b-th7kc 1/1 Running 0 14m
nginx-deploy-5b595999-tj8ms 1/1 Running 0 43m
10.kubectl set image deployment可以设置deployment的镜像更新,kubectl rollout status将 deployment的更新状态输出。kubectl rollout undo deployment可以实现回滚,如果不指定参数,回滚到最近一个版本。
[root@master ~]# kubectl set image deployment myapp myapp=ikubernetes/myapp:v2
deployment.extensions/myapp image updated
[root@master ~]# kubectl rollout status deployment myapp
Waiting for deployment "myapp" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "myapp" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "myapp" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "myapp" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "myapp" rollout to finish: 1 old replicas are pending termination...
deployment "myapp" successfully rolled out
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
client 1/1 Running 0 1h
myapp-74c94dcb8c-bvsm5 1/1 Running 0 1m
myapp-74c94dcb8c-xkz2x 1/1 Running 0 1m
myapp-74c94dcb8c-zngl9 1/1 Running 0 1m
nginx-deploy-5b595999-tj8ms 1/1 Running 0 52m
[root@master ~]# kubectl rollout undo deployment myapp
deployment.extensions/myapp
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
client 1/1 Running 0 1h
myapp-848b5b879b-7h254 1/1 Running 0 11s
myapp-848b5b879b-d7rjs 1/1 Running 0 13s
myapp-848b5b879b-wv5cz 1/1 Running 0 14s
nginx-deploy-5b595999-tj8ms 1/1 Running 0 54m
11.kubectl edit svc可以修改服务配置文件参数type: ClusterIP --》type: Node Port,来让物理机可以访问service。这里可以看到自动转发的端口为31601/TCP,尝试在物理机上进行访问,可以访问网页。
[root@master ~]# kubectl edit svc myapp
service/myapp edited
type: ClusterIP --》type: Node Port
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7h
myapp NodePort 10.99.24.155 <none> 80:31601/TCP 26m
nginx ClusterIP 10.101.146.21 <none> 80/TCP 50m