[toc]
kubernetes 操作记录二 Kubernetes Pod 控制器 Replica Set(RS) kubernetes 新一代的Pod controller COPY
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
name: myapp-pod
labels:
app: myapp
release: canary
environment: qa
spec:
containers:
- name: myapp-container
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
NAME DESIRED CURRENT READY AGE
myapp 2 2 2 6m51s
NAME READY STATUS RESTARTS AGE
myapp-5xbwq 1 /1 Running 0 7m17s
myapp-jdzph 1 /1 Running 0 7m17s
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
NAME READY STATUS RESTARTS AGE
myapp-jdzph 1 /1 Running 0 10m
myapp-xg9mm 1 /1 Running 0 16s
NAME READY STATUS RESTARTS AGE LABELS
myapp-jdzph 1 /1 Running 0 31m app=myapp,environment=qa,release=canary
精确满足用户期望
apply -f 声明式更新,即可以创建,也可以更新 COPY
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
NAME READY UP-TO-DATE AVAILABLE AGE
myapp-deploy 2 /2 2 2 115s
NAME READY STATUS RESTARTS AGE
myapp-deploy-67b6dfcd8-6q725 1 /1 Running 0 4m39s
myapp-deploy-67b6dfcd8-mshw8 1 /1 Running 0 4m39s
将 replicas: 2 改为 replicas: 3
NAME READY STATUS RESTARTS AGE
myapp-deploy-67b6dfcd8-6q725 1 /1 Running 0 6m34s
myapp-deploy-67b6dfcd8-gltjz 1 /1 Running 0 58s
myapp-deploy-67b6dfcd8-mshw8 1 /1 Running 0 6m34s
实现流动更新 COPY
image: ikubernetes/myapp:v1 改为 image: ikubernetes/myapp:v2
NAME READY STATUS RESTARTS AGE
myapp-deploy-67b6dfcd8-6q725 1/1 Running 0 3h23m
myapp-deploy-67b6dfcd8-gltjz 1/1 Running 0 3h18m
myapp-deploy-67b6dfcd8-mshw8 1/1 Running 0 3h23m
myapp-deploy-675558bfc5-89nc7 0/1 Pending 0 0s
myapp-deploy-675558bfc5-89nc7 0/1 Pending 0 0s
myapp-deploy-675558bfc5-89nc7 0/1 ContainerCreating 0 0s
myapp-deploy-675558bfc5-89nc7 1/1 Running 0 2s
myapp-deploy-67b6dfcd8-gltjz 1/1 Terminating 0 3h18m
myapp-deploy-675558bfc5-7zht2 0/1 Pending 0 0s
myapp-deploy-675558bfc5-7zht2 0/1 Pending 0 0s
myapp-deploy-675558bfc5-7zht2 0/1 ContainerCreating 0 0s
myapp-deploy-67b6dfcd8-gltjz 0/1 Terminating 0 3h18m
myapp-deploy-675558bfc5-7zht2 1/1 Running 0 3s
myapp-deploy-67b6dfcd8-6q725 1/1 Terminating 0 3h24m
myapp-deploy-675558bfc5-xjq9z 0/1 Pending 0 0s
myapp-deploy-675558bfc5-xjq9z 0/1 Pending 0 0s
myapp-deploy-675558bfc5-xjq9z 0/1 ContainerCreating 0 0s
myapp-deploy-67b6dfcd8-gltjz 0/1 Terminating 0 3h18m
myapp-deploy-67b6dfcd8-gltjz 0/1 Terminating 0 3h18m
myapp-deploy-67b6dfcd8-6q725 0/1 Terminating 0 3h24m
myapp-deploy-675558bfc5-xjq9z 1/1 Running 0 2s
myapp-deploy-67b6dfcd8-mshw8 1/1 Terminating 0 3h24m
myapp-deploy-67b6dfcd8-6q725 0/1 Terminating 0 3h24m
myapp-deploy-67b6dfcd8-6q725 0/1 Terminating 0 3h24m
myapp-deploy-67b6dfcd8-mshw8 0/1 Terminating 0 3h24m
myapp-deploy-67b6dfcd8-mshw8 0/1 Terminating 0 3h24m
myapp-deploy-67b6dfcd8-mshw8 0/1 Terminating 0 3h24m
查看目前所有的replica set COPY
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
myapp-deploy-675558bfc5 3 3 3 3m19s myapp ikubernetes/myapp:v2 app=myapp,pod-template-hash=675558bfc5,release=canary
myapp-deploy-67b6dfcd8 0 0 0 3h27m myapp ikubernetes/myapp:v1 app=myapp,pod-template-hash=67b6dfcd8,release=canary
查看历史滚动信息 COPY
deployment.extensions/myapp-deploy
REVISION CHANGE-CAUSE
1 <none>
2 <none>
定义一个补丁 COPY
NAME READY STATUS RESTARTS AGE
myapp-deploy-675558bfc5-7zht2 1/1 Running 0 11m
myapp-deploy-675558bfc5-89nc7 1/1 Running 0 11m
myapp-deploy-675558bfc5-9nkk4 1/1 Running 0 33s
myapp-deploy-675558bfc5-rbs4d 1/1 Running 0 33s
myapp-deploy-675558bfc5-xjq9z 1/1 Running 0 11m
COPY
deployment.extensions/myapp-deploy patched
RollingUpdateStrategy: 0 max unavailable, 1 max surge
金丝雀更新发布 COPY
deployment.extensions/myapp-deploy image updated
deployment.extensions/myapp-deploy paused
NAME READY STATUS RESTARTS AGE
myapp-deploy-675558bfc5-7zht2 1/1 Running 0 27m
myapp-deploy-675558bfc5-89nc7 1/1 Running 0 27m
myapp-deploy-675558bfc5-9nkk4 1/1 Running 0 17m
myapp-deploy-675558bfc5-rbs4d 1/1 Running 0 17m
myapp-deploy-675558bfc5-xjq9z 1/1 Running 0 27m
myapp-deploy-7f577979c8-92tj8 0/1 Pending 0 0s
myapp-deploy-7f577979c8-92tj8 0/1 Pending 0 0s
myapp-deploy-7f577979c8-92tj8 0/1 ContainerCreating 0 0s
myapp-deploy-7f577979c8-92tj8 1/1 Running 0 14s
使用以下命令进行监控更新 COPY
Waiting for deployment "myapp-deploy" rollout to finish: 1 out of 5 new replicas have been updated...
若发现没有问题后继续更新
COPY
deployment.extensions/myapp-deploy resumed
Waiting for deployment "myapp-deploy" rollout to finish: 1 out of 5 new replicas have been updated...
Waiting for deployment spec update to be observed...
Waiting for deployment spec update to be observed...
Waiting for deployment "myapp-deploy" rollout to finish: 1 out of 5 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 1 out of 5 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 2 out of 5 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 2 out of 5 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 2 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: 4 out of 5 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 4 out of 5 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 4 out of 5 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "myapp-deploy" rollout to finish: 1 old replicas are pending termination...
deployment "myapp-deploy" successfully rolled out
若更新时发现问题,我们可以执行回滚 查看可以回滚的版本
COPY
deployment.extensions/myapp-deploy
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 <none>
COPY
deployment.extensions/myapp-deploy rolled back
deployment.extensions/myapp-deploy
REVISION CHANGE-CAUSE
2 <none>
3 <none>
4 <none>
这时第一版已经回滚成第一版了
COPY
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
myapp-deploy-675558bfc5 0 0 0 42m myapp ikubernetes/myapp:v2 app=myapp,pod-template-hash=675558bfc5,release=canary
myapp-deploy-67b6dfcd8 5 5 5 4h6m myapp ikubernetes/myapp:v1 app=myapp,pod-template-hash=67b6dfcd8,release=canary
DaemonSet DaemonSet 在整个集群的每个节点上只运行指定Pod的一个副本,用于系统级的管理功能 比如filebeat,收集日志的服务
COPY
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: redis
role: logstor
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: filebeat-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
- name: REDIS_LOG_LEVEL
value: info
service/redis exposed
daemonset.extensions/filebeat-ds image updated
Kubernetes Service ExternalName, ClusterIP, NodePort, and LoadBalancer
COPY
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: default
spec:
selector:
app: redis
role: logstor
clusterIP: 10.96 .88 .88
type: ClusterIP
ports:
- port: 6339
targetPort: 6379
资源记录 SVC_NAME.NS_NAME.DOMAIN.LTD. svc.cluster.local redis.default.svc.cluster.local
COPY
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
selector:
app: myapp
release: canary
clusterIP: 10.99 .99 .99
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30080
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myapp NodePort 10.99 .99 .99 <none> 80 :30080/TCP 4m50s
ssjinyao ➤ while true ; do curl 10.1 .87 .82 :30080/hostname.html ; sleep 1 ; done
myapp-deploy-675558bfc5-5c8hn
myapp-deploy-675558bfc5-qtlqf
myapp-deploy-675558bfc5-qtlqf
myapp-deploy-675558bfc5-5c8hn
myapp-deploy-675558bfc5-qgps7
myapp-deploy-675558bfc5-5c8hn
myapp-deploy-675558bfc5-qgps7
myapp-deploy-675558bfc5-qgps7
myapp-deploy-675558bfc5-qtlqf
service/myapp patched
Name: myapp
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion" :"v1" ,"kind" :"Service" ,"metadata" : {"annotations" : {},"name" :"myapp" ,"namespace" :"default" },"spec" : {"clusterIP" :"10.99.99.99" ,"...
Selector: app=myapp,release=canary
Type: NodePort
IP: 10.99.99.99
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 30080/TCP
Endpoints: 10.244.1.150:80,10.244.2.166:80,10.244.3.167:80
Session Affinity: ClientIP
External Traffic Policy: Cluster
Events: <none>
ssjinyao ➤ while true; do curl 10.1.87.82:30080/hostname.html ; sleep 1 ; done
myapp-deploy-675558bfc5-qgps7
myapp-deploy-675558bfc5-qgps7
myapp-deploy-675558bfc5-qgps7
myapp-deploy-675558bfc5-qgps7
无头服务
COPY
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
namespace: default
spec:
selector:
app: myapp
release: canary
clusterIP: None
ports:
- port: 80
targetPort: 80
service/myapp-svc created
; <<>> DiG 9.9 .4 -RedHat-9.9.4-73.el7_6 <<>> -t A myapp-svc.default.svc.cluster.local. @10.96.0.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38590
;; flags: qr aa rd; QUERY: 1 , ANSWER: 3 , AUTHORITY: 0 , ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0 , flags:; udp: 4096
;; QUESTION SECTION:
;myapp-svc.default.svc.cluster.local. IN A
;; ANSWER SECTION:
myapp-svc.default.svc.cluster.local. 5 IN A 10.244 .3 .167
myapp-svc.default.svc.cluster.local. 5 IN A 10.244 .1 .150
myapp-svc.default.svc.cluster.local. 5 IN A 10.244 .2 .166
;; Query time: 0 msec
;; SERVER: 10.96 .0 .10
;; WHEN: Thu May 16 10 :59:03 CST 2019
;; MSG SIZE rcvd: 217
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96 .0 .10 <none> 53 /UDP,53/TCP,9153/TCP 20d
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp-deploy-675558bfc5-5c8hn 1 /1 Running 0 42h 10.244 .1 .150 bj-gzf-vm-ops-test01 <none> <none>
myapp-deploy-675558bfc5-qgps7 1 /1 Running 0 42h 10.244 .2 .166 bj-gzf-vm-ops-test02 <none> <none>
myapp-deploy-675558bfc5-qtlqf 1 /1 Running 0 42h 10.244 .3 .167 bj-gzf-vm-ops-test03 <none> <none>
ingress 及 ingress controller COPY
for file in configmap.yaml mandatory.yaml namespace.yaml rbac.yaml with-rbac.yaml ; do wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/$file ; done
COPY
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
selector:
app: myapp
release: canary
ports:
- name: httpd
targetPort: 80
port: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
labels:
app: myapp
release: canary
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v2
ports:
- name: http
containerPort: 80
COPY
/root/ingress-nginx
configmap.yaml mandatory.yaml namespace.yaml rbac.yaml service-nodeport.yaml with-rbac.yaml
COPY
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
nodePort: 30080
- name: https
port: 443
targetPort: 443
protocol: TCP
nodePort: 30443
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx NodePort 10.96 .59 .169 <none> 80 :30080/TCP,443:30443/TCP 2m35s
现在可以尝试访问
查看访问apiVersion
COPY
KIND: Ingress
VERSION: extensions/v1beta1
COPY
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-myapp
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: myapp.ssjinyao.com
http:
paths:
- path:
backend:
serviceName: myapp
servicePort: 80
COPY
Name: ingress-myapp
Namespace: default
Address:
Default backend: default-http-backend:80 (<none>)
Rules:
Host Path Backends
---- ---- --------
myapp.ssjinyao.com
myapp:80 (10.244.1.150:80,10.244.2.166:80,10.244.3.167:80)
Annotations:
kubectl.kubernetes.io/last-applied-configuration: {"apiVersion" :"extensions/v1beta1" ,"kind" :"Ingress" ,"metadata" :{"annotations" :{"kubernetes.io/ingress.class" :"nginx" },"name" :"ingress-myapp" ,"namespace" :"default" },"spec" :{"rules" :[{"host" :"myapp.ssjinyao.com" ,"http" :{"paths" :[{"backend" :{"serviceName" :"myapp" ,"servicePort" :80},"path" :null}]}}]}}
kubernetes.io/ingress.class: nginx
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CREATE 18s nginx-ingress-controller Ingress default/ingress-myapp
这时再访问
tomcat 七层负载创建
COPY
apiVersion: v1
kind: Service
metadata:
name: tomcat
namespace: default
spec:
selector:
app: tomcat
release: canary
ports:
- name: httpd
targetPort: 8080
port: 8080
- name: ajp
targetPort: 8009
port: 8009
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deploy
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: tomcat
release: canary
template:
metadata:
labels:
app: tomcat
release: canary
spec:
containers:
- name: tomcat
image: tomcat:8.5.32-jre8-alpine
ports:
- name: http
containerPort: 8080
- name: ajp
containerPort: 8009
COPY
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-tomcat
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: tomcat.ssjinyao.com
http:
paths:
- path:
backend:
serviceName: tomcat
servicePort: 8080
secret 创建与使用
COPY
secret/tomcat-ingress-secret created
Name: tomcat-ingress-secret
Namespace: default
Labels: <none>
Annotations: <none>
Type: kubernetes.io/tls
Data
====
tls.crt: 3659 bytes
tls.key: 1675 bytes
COPY
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-tomcat-tls
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
tls:
- hosts:
- tomcat.ssjinyao.com
secretName: tomcat-ingress-secret
rules:
- host: tomcat.ssjinyao.com
http:
paths:
- path:
backend:
serviceName: tomcat
servicePort: 8080
NAME HOSTS ADDRESS PORTS AGE
ingress-tomcat tomcat.ssjinyao.com 80 39m
ingress-tomcat-tls tomcat.ssjinyao.com 80 , 443 93s
Name: ingress-tomcat-tls
Namespace: default
Address:
Default backend: default-http-backend:80 (<none>)
TLS:
tomcat-ingress-secret terminates tomcat.ssjinyao.com
Rules:
Host Path Backends
---- ---- --------
tomcat.ssjinyao.com
tomcat:8080 (10.244.1.153:8080,10.244.2.171:8080,10.244.3.170:8080)
Annotations:
kubectl.kubernetes.io/last-applied-configuration: {"apiVersion" :"extensions/v1beta1" ,"kind" :"Ingress" ,"metadata" : {"annotations" : {"kubernetes.io/ingress.class" :"nginx" },"name" :"ingress-tomcat-tls" ,"namespace" :"default" },"spec" : {"rules" : [{"host" :"tomcat.ssjinyao.com" ,"http" : {"paths" : [{"backend" : {"serviceName" :"tomcat" ,"servicePort" :8080 },"path" :null }]}}],"tls" : [{"hosts" : ["tomcat.ssjinyao.com" ],"secretName" :"tomcat-ingress-secret" }]}}
kubernetes.io/ingress.class: nginx
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CREATE 2m29s nginx-ingress-controller Ingress default/ingress-tomcat-tls