vim deploy-demo.yaml
[root@master test]# cat deploy-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
labels:
app: myapp
release: canary
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
kubectl apply -f deploy-demo.yaml
apply声明式创建,也可以创建,也可以更新
kubectl get pods
[root@master test]# kubectl get pods
NAME READY STATUS RESTARTS AGE
client 1/1 Running 0 2d
myapp-deploy-69b47bc96d-2k2ck 1/1 Running 0 8s
myapp-deploy-69b47bc96d-pm48p 1/1 Running 0 8s
readiness-httpget-container 1/1 Running 0 23h
查看创建:
kubectl get deploy
[root@master test]# kubectl get deploy
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
myapp-deploy 2 2 2 2 31s
kubectl get rs
[root@master test]# kubectl get rs
NAME DESIRED CURRENT READY AGE
myapp-deploy-69b47bc96d 2 2 2 52s
如果想更新的话,直接编辑deploy-demo.yaml文件即可
replicas=5
执行:
kubectl apply -f deploy-demo.yaml
注意:apply是可以执行多次的
[root@master test]# kubectl get rs
NAME DESIRED CURRENT READY AGE
myapp-deploy-69b47bc96d 5 5 5 9m
[root@master test]# kubectl get pods
NAME READY STATUS RESTARTS AGE
client 1/1 Running 0 2d
myapp-deploy-69b47bc96d-58dj7 1/1 Running 0 10s
myapp-deploy-69b47bc96d-8lsjj 1/1 Running 0 10s
myapp-deploy-69b47bc96d-9rrhl 1/1 Running 0 9m
myapp-deploy-69b47bc96d-9xz65 1/1 Running 0 9m
myapp-deploy-69b47bc96d-pr94f 1/1 Running 0 10s
readiness-httpget-container 1/1 Running 0 23h
运行的容器更新版本:
vim deploy-demo.yaml
image: ikubernetes/myapp:v2
kubectl apply -f deploy-demo.yaml 直接就会重新生成容器,全部更新
查看更新后的状态:
kubectl get rs
[root@master test]# kubectl get rs
NAME DESIRED CURRENT READY AGE
myapp-deploy-67f6f6b4dc 5 5 5 17s
myapp-deploy-69b47bc96d 0 0 0 11m
kubectl get rs -o wide
[root@master test]# kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
myapp-deploy-67f6f6b4dc 5 5 5 1m myapp ikubernetes/myapp:v2 app=myapp,pod-template-hash=2392926087,release=canary
myapp-deploy-69b47bc96d 0 0 0 11m myapp ikubernetes/myapp:v1 app=myapp,pod-template-hash=2560367528,release=canary
查看历史的滚动记录
kubectl rollout history deployment myapp-deploy
[root@master test]# kubectl rollout history deployment myapp-deploy
deployments "myapp-deploy"
REVISION CHANGE-CAUSE
1 <none>
2 <none>
如果想返回上面的一个版本:
[root@master test]# kubectl rollout undo deployment myapp-deploy
deployment.extensions/myapp-deploy
[root@master test]# kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
myapp-deploy-67f6f6b4dc 0 0 0 5m myapp ikubernetes/myapp:v2 app=myapp,pod-template-hash=2392926087,release=canary
myapp-deploy-69b47bc96d 5 5 5 16m myapp ikubernetes/myapp:v1 app=myapp,pod-template-hash=2560367528,release=canary
K8S 应用的灵活更新
先启动一个监控窗口:
kubectl get pods -l app=myapp -w
再启动一个执行更新的窗口:
[root@master test]# kubectl set image deployment myapp-deploy myapp=ikubernetes/myapp:v3 && kubectl rollout pause deployment myapp-deploy
deployment.extensions/myapp-deploy image updated
deployment.extensions/myapp-deploy paused
监控端:显示现在镜像,创建容器 #金丝雀发布
也可以使用这个命令来查看更新:
[root@master test]# kubectl rollout status deployment myapp-deploy
Waiting for deployment "myapp-deploy" rollout to finish: 3 out of 5 new replicas have been updated...
更新完成3个,共5个
系统没有继续更新:执行下面的继续更新
[root@master test]# kubectl rollout resume deployment myapp-deploy
deployment.extensions/myapp-deploy resumed
五个全部更新完成
Waiting for deployment "myapp-deploy" rollout to finish: 3 out of 5 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 3 out of 5 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 3 out of 5 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 3 out of 5 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 3 out of 5 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 3 out of 5 new replicas have been updated
查看历史的版本:
kubectl get rs -o wide
[root@master test]# kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
myapp-deploy-67f6f6b4dc 0 0 0 4m myapp ikubernetes/myapp:v2 app=myapp,pod-template-hash=2392926087,release=canary
myapp-deploy-6bdcd6755d 5 5 5 3m myapp ikubernetes/myapp:v3 app=myapp,pod-template-hash=2687823118,release=canary
通过上面发现,系统的版本都更新到了v3版,原来的版本已经暂停了
日志上显示,下载镜像,删除一个,创建一个,可以控制节奏
回滚版本:
先查看版本:
[root@master test]# kubectl rollout history deployment myapp-deploy
deployments "myapp-deploy"
REVISION CHANGE-CAUSE
1 <none>
2 <none>
回滚到第一个版本:
[root@master test]# kubectl rollout undo deployment myapp-deploy --to-revision=1
deployment.extensions/myapp-deploy
查看是否回滚成功:
[root@master test]# kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
myapp-deploy-67f6f6b4dc 5 5 5 9m myapp ikubernetes/myapp:v2 app=myapp,pod-template-hash=2392926087,release=canary
myapp-deploy-6bdcd6755d 0 0 0 8m myapp ikubernetes/myapp:v3 app=myapp,pod-template-hash=2687823118,release=canary
已经回滚成功
继续查看版本:
[root@master test]# kubectl rollout history deployment myapp-deploy
deployments "myapp-deploy"
REVISION CHANGE-CAUSE
2 <none>
3 <none>
部署redis项目
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: redis
role: logstor
#redis日志的存储器
template:
metadata:
labels:
app: redis
role: logstor
spec:
containers:
- name: redis
image: redis:4.0-alpine
ports:
- name: redis
containerPort: 6379
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filb-ds
namespace: default
spec:
selector:
matchLabels:
app: filebeat
release: stable
template:
metadata:
labels:
app: filebeat
release: stable
spec:
containers:
- name: filebeat
image: ikubernetes/filebeat:5.6.5-alpine
env:
- name: REDIS_HOST
value: redis.default.svc.cluster.local
#redis服务名
#namespace 命名空间
#svc.cluster.local地址
- name: REDIS_LOG_LEVEL
value: info
链接方式都是service 主机名
在docker pull ikubernetes/filebeat:5.6.5-alpine
进入redis容器:
kubectl exec -it redis-5b5d6fbbbd-hb4pm -- /bin/sh
/data # netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN
tcp 0 0 :::6379 :::* LISTEN
/data # nslookup redis.default.svc.cluster.local
在容器中使用这个容器解析到这里
/data # nslookup redis.default.svc.cluster.local
nslookup: can't resolve '(null)': Name does not resolve
Name: redis.default.svc.cluster.local
Address 1: 10.103.208.232 redis.default.svc.cluster.local
容器内部:redis测试连接:
redis-cli -h redis.default.svc.cluster.local
/data # redis-cli -h redis.default.svc.cluster.local
redis.default.svc.cluster.local:6379> keys *
(empty list or set)
退出容器后查看:
[root@master test]# kubectl get pods
NAME READY STATUS RESTARTS AGE
client 1/1 Running 0 2d
filb-ds-7tjbh 1/1 Running 0 9m
filb-ds-v566t 1/1 Running 0 9m
myapp-deploy-67f6f6b4dc-6sbwc 1/1 Running 0 3h
myapp-deploy-67f6f6b4dc-cv4cv 1/1 Running 0 3h
myapp-deploy-67f6f6b4dc-lc4sp 1/1 Running 0 3h
myapp-deploy-67f6f6b4dc-msdfm 1/1 Running 0 3h
myapp-deploy-67f6f6b4dc-tvxpb 1/1 Running 0 3h
readiness-httpget-container 1/1 Running 0 1d
redis-5b5d6fbbbd-hb4pm 1/1 Running 0 9m
进入filb容器
[root@master test]# kubectl exec -it filb-ds-7tjbh -- /bin/sh
/ # ps aux
PID USER TIME COMMAND
1 root 0:00 /usr/local/bin/filebeat -e -c /etc/filebeat/filebeat.yml
11 root 0:00 /bin/sh
15 root 0:00 ps aux
查看容器内的环境变量
printenv
查看容器内的环境变量
/ # printenv
KUBERNETES_SERVICE_PORT=443
REDIS_PORT=tcp://10.103.208.232:6379
KUBERNETES_PORT=tcp://10.96.0.1:443
REDIS_SERVICE_PORT=6379
REDIS_PORT_6379_TCP_ADDR=10.103.208.232
HOSTNAME=filb-ds-7tjbh
SHLVL=1
HOME=/root
REDIS_PORT_6379_TCP_PORT=6379
NGINX_PORT_80_TCP=tcp://10.111.8.112:80
REDIS_PORT_6379_TCP_PROTO=tcp
MYAPP_SERVICE_HOST=10.101.151.96
MYAPP_SERVICE_PORT=80
MYAPP_PORT=tcp://10.101.151.96:80
REDIS_PORT_6379_TCP=tcp://10.103.208.232:6379
TERM=xterm
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
MYAPP_PORT_80_TCP_ADDR=10.101.151.96
NGINX_SERVICE_HOST=10.111.8.112
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
REDIS_LOG_LEVEL=info
KUBERNETES_PORT_443_TCP_PROTO=tcp
MYAPP_PORT_80_TCP_PORT=80
MYAPP_PORT_80_TCP_PROTO=tcp
NGINX_SERVICE_PORT=80
NGINX_PORT=tcp://10.111.8.112:80
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
PWD=/
KUBERNETES_SERVICE_HOST=10.96.0.1
REDIS_SERVICE_HOST=10.103.208.232
MYAPP_PORT_80_TCP=tcp://10.101.151.96:80
REDIS_HOST=redis.default.svc.cluster.local
NGINX_PORT_80_TCP_ADDR=10.111.8.112
FILEBEAT_VERSION=5.6.5
NGINX_PORT_80_TCP_PORT=80
NGINX_PORT_80_TCP_PROTO=tcp
通过上面环境信息可以看出:
REDIS_HOST=redis.default.svc.cluster.local 连接信息已经生效了
查看解析设置
/ # nslookup redis.default.svc.cluster.local
nslookup: can't resolve '(null)': Name does not resolve
Name: redis.default.svc.cluster.local
Address 1: 10.103.208.232 redis.default.svc.cluster.local
[root@master ~]# kubectl get pods -l app=filebeat -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
filb-ds-7tjbh 1/1 Running 0 2h 10.244.2.52 node2 <none>
filb-ds-v566t 1/1 Running 0 2h 10.244.1.50 node1 <none>
[root@master ~]# kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
filb-ds 2 2 2 2 2 <none> 3h
[root@master ~]# kubectl set image daemonsets filb-ds filebeat=ikubernetes/filebeat:5.6.6-alpine
daemonset.extensions/filb-ds image updated
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
client 1/1 Running 0 2d
filb-ds-2cqcv 1/1 Running 0 8m
filb-ds-p9tt2 1/1 Running 0 7m
myapp-deploy-67f6f6b4dc-6sbwc 1/1 Running 0 6h
myapp-deploy-67f6f6b4dc-cv4cv 1/1 Running 0 6h
myapp-deploy-67f6f6b4dc-lc4sp 1/1 Running 0 6h
myapp-deploy-67f6f6b4dc-msdfm 1/1 Running 0 6h
myapp-deploy-67f6f6b4dc-tvxpb 1/1 Running 0 6h
readiness-httpget-container 1/1 Running 0 1d
redis-5b5d6fbbbd-hb4pm 1/1 Running 0 3h