查看k8s的所有命名空间
kubectl get namespace
或者
kubectl get ns
创建名称空间
kubectl create ns 名称
或使用yaml方式
- appVersion: v1
- kind: Namespace
- metedata:
- name: hello
appVersion表示版本号,kind表示种类(说明是名称空间,若是pod就是pod类型),metedata.name表示名称为hello的名称空间
删除yaml方式创建的名称空间,需要这样删除:
- #可以yaml文件和yaml文件执行的结果(这里是删除名称空间)
- kubectl delete -f yaml文件
删除名称空间
kubectl delete ns 名称
注意以下命令
kubectl get pods -A
- -A:All表示所有的名称空间
- 这条命令表示获取所有名称空间下的所有pod
kubectl get pods
- 没有指定名称空间,那么默认为default空间
kubectl get pods -n kubernetes-dashboard
- -n:-namespace:用于指定名称空间
- 这条命令表示获取kubernetes-dashboard空间下的所有pod
kubectl run mynginx --image=nginx
删除Pod
kubectl delete pod mynginx
kubectl describe pod pod的名称
会打印Pod的构建信息,如Pod的构建event事件
创建一个pod.yaml(文件名任意命名),复制一下内容
- apiVersion: v1
- kind: Pod
- metadata:
- labels:
- run: mynginx
- name: mynginx
- # namespace: default
- spec:
- containers:
- - image: nginx
- name: mynginx
应用yaml
kubectl apply -f pod.yaml
查看构建信息
kubectl describe pod mynginx
删除配置文件创建的pod
kubectl delete -f pod.yaml
把2.3中的代码复制进行:
之后k8s在创建pod
kubectl logs pod名字
上述默认是查看default名称空间下的pod
指定名称空间获取pod日志:
kubectl logs pod名字 -n namespace名字
-n namespace名字:缺省,则表示查询的是default名称空间
kubectl logs pod名字 -n namespace名字
kubectl get pod -o wide
- -o wide:可以写成 -owide
- 上述默认查询的是default名称空间,可以使用kubectl get pod -o wide -A获取所有pod
kubectl exec -it pod名字 -- /bin/bash
- apiVersion: v1
- kind: Pod
- metadata:
- labels:
- run: myapp
- name: myapp
- # namespace: default
- spec:
- containers:
- - image: nginx
- name: mynginx
- - image: tomcat8.5.68
- name: mytomcat
语法:
kubectl create deployment deployment的名字 --image=镜像名称
eg:
kubectl create deployment mytomcat --image=tomcat:8.5.68
语法:
kubectl delete deployment deployment的名字
eg:
kubectl delete deployment mytomcat
与删除pod的区别
语法:
kubectl create deployment deployment的名字 --image=镜像名称 --replicas=pod的数量
eg:
kubectl create deployment mytomcat --image=tomcat:8.5.68 --replicas=3
如下图,创建了3个pod
yaml文件配置方式
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- labels:
- app: mytomcat
- name: mytomcat
- spec:
- replicas: 3
- selector:
- matchLabels:
- app: mytomcat
- template:
- metadata:
- labels:
- app: mytomcat
- spec:
- containers:
- - image: tomcat
- name: tomcat
语法:
kubectl scale deployment/deployment的名字 --replicas=pod的数量
eg::
kubectl deployment/mytomcat scale --replicas=5
自愈:deployment下的pod出现问题,k8s会对该pod自动进行重启修复
故障转移:当一个pod所在的节点宕机后,k8s会把宕机的pod自动拉到其他的node进行运行
假设deployment下有3个pod,这3个pod为同一个镜像应用,当该镜像更新时,需要对k8s的pod进行更新,而滚动更新的作用就是:
更新步骤:
滚动更新只需要一个指令,即可执行上述步骤:
语法:
kubectl set image deployment/deployment的名字 原镜像=新镜像 --record
eg:
kubectl set image deployment/mytomcat tomcat=tomcat --record
kubectl edit deployment mytomcat #mytomcat为deployment的名字
k8s支持deployment版本回退,且回退是滚动更新的过程!
回退流程:
<1>查看deployment的版本列表
格式:
kubectl rollout history deployment/deployment的名字
eg:
kubectl rollout history deployment/mytomcat
CHANGE-CAUSE:类似于GIT每次提交的message,只是k8s可以不写(none),在变更deployment的时,使用 --record来保存记录,参考3.7
<2>检查当前deployment使用的镜像版本
kubectl get deployment mytomcat -oyaml
或者
kubectl get deployment mytomcat -oyaml | grep tomcat
<3>查看某个版本的yaml详情
kubectl rollout history deployment/mytomcat --revision=1
或者直接查看镜像:
kubectl rollout history deployment/mytomcat --revision=1 | grep image
<4>版本回退
#回退到上次版本
kubectl rollout undo deployment/mytomcat
#回退到指定版本
kubectl rollout undo deployment/mytomcat --to-revision=1
除了Deployment,k8s还有 StatefulSet 、DaemonSet 、Job 等 类型资源。我们都称为 工作负载。
有状态应用使用 StatefulSet 部署,无状态应用使用 Deployment 部署
官方文档:https://kubernetes.io/zh/docs/concepts/workloads/controllers/
不使用service时存在的问题:
- 当一个项目需要启动多个pod,每个pod的IP是不同的,假设我们通过某一个pod的IP去访问项目,若该pod宕机后,我们需要手动切换pod的IP(虽然可以使用nginx的负载均衡去实现切换,但是无状态pod的IP是会改变的,除非每次去变更nginx的配置)
- 当一个项目存在多个pod时,我们只能去连接某一个pod,并不能把所有的pod的资源使用起来
Service解决的问题:
- 把相同标签的一组pod暴露成一个统一访问的服务,我们只需要访问service即可访问标签中的所有pod(负载均衡的方式)
kubectl expose deploy deployment的名字 --port=指定暴露的端口 --target-port=pod中需要暴露的端口
eg:把mytomcat的deployment中,pod的8080端口暴露给service服务8000端口
kubectl expose deploy mytomcat --port=8000 --target-port=8080
kubectl get svc -A
或者
kubectl get svc
- apiVersion: v1
- kind: Service
- metadata:
- labels:
- app:mytomcat
- name: mytomcat
- spec:
- selector:
- app: mytomcat #pod的标签
- ports:
- - port: 8000
- protocol: TCP
- targetPort: 8080
kubectl get pod --show-labels
默认方式(clusterIP 集群IP访问):
kubectl expose deployment mytomcat --port=8000 --target-port=8080
等同于:
kubectl expose deployment mytomcat --port=8000 --target-port=8080 --type=ClusterIP
yaml方式:
- apiVersion: v1
- kind: Service
- metadata:
- labels:
- app: mytomcat
- name: mytomcat
- spec:
- ports:
- - port: 8000
- protocol: TCP
- targetPort: 8080
- selector:
- app: mytomcat
- type: ClusterIP #NodePort集群外访问
NodePort暴露方式
kubectl expose deployment mytomcat --port=8000 --target-port=8080 --type=NodePort
NodePort范围在 30000-32767 之间
访问方式:集群任意node节点+端口,即可访问Service
如:http://111.230.19.178:31634/
kubectl get node -owide
kubectl expose deployment mytomcat --port=8000 --target-port=8080
kubectl expose deploy mynginx --port=8000 --target-port=80 --type=NodePort
因为calico问题,我现在只能在mynginx的工作节点才能访问上述service的IP
如下(在我的k8s-node1中访问):
浏览器使用k8s-node1的IP家31522端口: