一、创建pod的两种方式
1.命令方式
①创建命令:
#kubectl run kubia --image=luksa/kubia --replicas=3
②查看资源:
#kubectl get pod -o wide
2.文件方式
#vim nginx-master.yaml
apiVersion: extensions/v1beta1 #描述文件遵循extensions/v1beta1版本的Kubernetes API
kind: Deployment #创建资源类型为Deployment
metadata: #该资源元数据
name: nginx-master #Deployment名称
spec: #Deployment的规格说明
replicas: 3 #指定副本数为3
template: #定义Pod的模板
metadata: #定义Pod的元数据
labels: #定义label(标签)
app: nginx #label的key和value分别为app和nginx
spec: #Pod的规格说明
containers:
- name: nginx #容器的名称
image: nginx:latest #创建容器所使用的镜像
①执行创建命令
#kubectl create -f nginx-master.yaml
②查看创建的资源
#kubectl get deployments -o wide
#kubectl get pod
二、进入pod
进入pod kubia-66c8b6d4fc-qhsrd(master节点)
#kubectl exec -it kubia-66c8b6d4fc-qhsrd bash
三、标签
标签其实就是一对key/value,可以附加到资源的任意键值对,标签可以用来划分特定组的对象,用以选择具有改确切标签的资源。
1.pod使用标签
①pod指定标签
#kubectl run http-label --image=httpd --labels=“app=web,env=prod”
②查看pod的标签
#kubectl get pod -l app --show-labels
使用标签筛选pod,通过-l app参数可筛选所有标签为app的pod
③修改现有标签
#kubectl label pod http-label-7cf498876f-59mws env=debug --overwrite
#kubectl get pod --show-labels
④删除标签
#kubectl label pod http-label-7cf498876f-59mws env-
2.通过标签指定pod创建的节点
给node节点打标签
#kubectl label nodes master node=master
#kubectl label nodes node1 node=node1
#kubectl label nodes node2 node=node2
指定node创建pod
#vim httpd-node.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: httpd-node
spec:
template:
metadata:
labels:
env: prod
spec:
containers:
- name: httpd-node
image: httpd:latest
nodeSelector:
node: master
执行创建命令
#kubectl apply -f httpd-node.yaml
四、命名空间
Namespace是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的pods, services, replication controllers和deployments等都是属于某一个namespace的(默认是default)
1.查看命名空间
#kubectl get ns
2.查看指定命名空间的pod
#kubectl get pod --namespace=default
#kubectl get pod -n kube-system
3.创建命名空间
文件方式创建test01-namespace.yaml
#vim /data/shell/test01-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: test01-namespace
执行创建命令
①#kubectl apply -f test01-namespace.yaml
命令方式:
②#kubectl create ns test02-namespace
4.pod指定命名空间
①指定创建pod的命名空间为test01-namespace
#kubectl run httpd --image=httpd -n test01-namespace
②查询pod
#kubectl get pods -n test01-namespace
③命名空间切换
#alias kcd=‘kubectl config set-context $(kubectl config current-context) --namespace’
#kcd test01-namespace
五、扩容/缩容
创建文件nginx-scale.yaml并新建资源
apiVersion: extensions/v1beta1 #描述文件遵循extensions/v1beta1版本的Kubernetes API
kind: Deployment #创建资源类型为Deployment
metadata: #该资源元数据
name: nginx-scale #Deployment名称
spec: #Deployment的规格说明
replicas: 3 #指定副本数为3
template: #定义Pod的模板
metadata: #定义Pod的元数据
labels: #定义label(标签)
env: prod #label的key和value分别为app和nginx
spec: #Pod的规格说明
containers:
- name: nginx-scale #容器的名称
image: nginx:latest #创建容器所使用的镜像
①执行创建
#kubectl -apply -f nginx-scale.yaml
②查看资源
③文件方式扩容:通过修改文件中参数replicas的值并重新执行kubectl apply命令即可实现pod的扩缩容
④命令方式
#kubectl scale deployment nginx-scale --replicas=1
六、failover
1.pod节点分布查看
#kubectl get pod -o wide --all-namespaces
2.faillover测试
节点node2关机
查看node状态和pod分布
#kubectl get pod -o wide --all
node2状态为NotReady且之前在该节点的pod被迁移至master或者node1.当node2恢复后,运行在该节点的Pod会被删除,且迁移至master和node1的Pod不会重新调度回到node2。
七、升级及回滚
1.创建deployment
#vim nginx-roll.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-roll
namespace: test02-namespace
spec:
selector:
matchLabels:
env: prod
replicas: 3
template:
metadata:
labels:
env: prod
spec:
containers:
- name: nginx-roll
image: nginx:1.16
创建deployment nginx-roll,副本数为3,namespace为test02-namespace,nginx版本为1.16,–record参数会记录历史版本号。
#kubectl apply -f nginx-roll.yaml --record
查看部署资源pod
2.升级
升级的方式有多种,比如[kubectl edit deployments -n test02-namespace nginx-roll]方式,直接修改nginx-roll.yaml文件、kubectl set image方式等。
①修改文件方式
#sed -i ‘s/image: nginx:1.16/image: nginx:1.17/g’ nginx-roll.yaml
#kubectl apply -f nginx-roll.yaml --record
#kubectl rollout status deployment -n test02-namespace nginx-roll
②kubectl set image方式
#kubectl set image deployment -n test02-namespace nginx-roll nginx-roll=nginx:1.17.5
3.回滚
①查看deployments版本
#kubectl rollout history deployments -n test02-namespace nginx-roll
②查看deployment具体版本信息
#kubectl rollout history deployments -n test02-namespace nginx-roll --revisinotallow=1
③回滚至上一个版本
#kubectl rollout undo deployment -n test02-namespace nginx-roll
④查看
#kubectl rollout status deployment -n test02-namespace nginx-roll
⑤回滚至指定版本
#kubectl rollout undo deployment -n test02-namespace nginx-roll --to-revisinotallow=1
⑥查看
⑦查看Replicasets
#kubectl get replicasets -n test02-namespace -o wide
可以看到升级过程中replicaset保留了修改的历史版本信息。
八、内网访问
1.创建pod
#vim web-svc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-svc
namespace: test02-namespace
spec:
selector:
matchLabels:
app: web-svc
replicas: 3
template:
metadata:
labels:
app: web-svc
spec:
containers:
- name: web-svc
image: httpd:latest
#kubectl apply -f web-svc.yaml
2.内网访问
创建service
#vim web-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: web-svc
namespace: test02-namespace
spec:
selector:
app: web-svc
ports:
- protocol: TCP
port: 8080
targetPort: 80
①创建内网service
#kubectl apply -f web-svc.yaml
②查看创建的service
#kubectl get service -n test02-namespace
③修改index.html
master节点:echo '<html><body><h1>It works!web-svc-58956c55fc-z6msf</h1></body></html>'>index.html
node1节点:echo '<html><body><h1>It works!web-svc-58956c55fc-dw5kk</h1></body></html>'>index.html
node2节点:echo '<html><body><h1>It works!web-svc-58956c55fc-bcpbx</h1></body></html>'>index.html
④内网访问pod
#for i in {1…10};do sleep 1;curl 10.102.203.64:8080;done
3.外网访问
修改service
新增’type: NodePort’和’nodePort: 30002’,通过NodePort方式外网访问pod,映射端口为30002,重新kubectl apply。(参考内网访问)
apiVersion: v1
kind: Service
metadata:
name: web-svc
namespace: test02-namespace
spec:
type: NodePort
selector:
app: web-svc
ports:
- protocol: TCP
nodePort: 30002
port: 8080
targetPort: 80
外网访问pod
#for i in {1…10};do sleep 1;curl 192.168.3.183:30002;done
九、日志查看
使用kubectl logs命令可获取pod日志
1.查看最近的日志
#kubectl logs web-svc-58956c55fc-bcpbx -n test02-namespace --tail=20
‘–tail=20’:查看命名空间test02-namespace下web-svc-58956c55fc-bcpbx最近20行的日志,
2.查看前一个容器的日志
#kubectl logs web-svc-58956c55fc-bcpbx -n test02-namespace --previous
3.通过标签查看日志
#kubectl logs -lapp=web
查看标签为‘app=web’的日志;’-lapp=web’该日志是标签为’app=web’的合集
十、删除pod
1.通过删除deployment删除pod
通过deployment创建pod可以直接删除deployment
#kubectl delete deployments kubia
2.通过删除namespace删除pod
①删除namespace中所有资源
#kubectl delete all --all -n test01-namespace
②直接删除namespace
#kubectl delete ns test01-namespace
总结:
直接删除pod会重建一个新的不同名的pod;
直接删除replicasets会重建同名replicasets,其下所有pod则会删除重建且名字不同;
直接删除deployments则其下的replicasets和pod将一起被删除;