1.命名空间(namespace)
一组资源集中管理的一个空间成为一个命名空间
默认命名空间为default
默认的命令行操作都为在当前命名空间下的操作
创建命名空间的两种方式
# 命令行创建命名空间
kubectl create ns helloword # 创建helloword的命名空间 ns是namespace的简写
# 删除命名空间
kubectl delete ns helloworld
yaml文件方式创建命名空间
# 创建文件
vi helloworld.yaml
# 添加以下内容
apiVersion: v1
kind: Namespace
metadata:
name: helloworld
# 保存退出并执行命令
kubectl apply -f helloworld.yaml
# 删除创建的命令空间
kube delete -f helloworld.yaml
ps:命名空间和命名空间之间网络不隔离,仅仅是资源隔离,可以互相访问,也可以做网络隔离操作
2.Pod
Pod是k8s可执行的最小工作单元
Pod是对docker的封装,但是一个Pod可以封装多个docker
下图一组Pod列表
# NAMESPACE 命令空间
# NAME Pod的名称
# READY 就绪状态
其中1/1表示表示Pod内部有一个容器,如果为2/3表示Pod内部有3个容器,2个已经正常启动
# STATUS Pod的状态(需要展开讲 很多)
pod的几种状态:
1)Pending:Pod创建已经提交给k8s,但是因为某种原因不能顺利创建,例如下载镜像慢,调度不成功等。
2)Running:Pod已经绑定到一个节点上了,并且已经创建了所有容器。只是有一个容器正在运行,或者在启动中。
3)Secceeded:Pod中的所有容器都已经成功终止,不能重新启动。
4)Failed: Pod中所有的容器均已经终止,且至少有一个容器已经在故障中终止。
5)Unkown:由于某中原因apiserver无法获取到Pod的状态。通常是由于Master与pod所在的主机失去连接了。
CrashLoopGBackOff: #pod,但是kubelet正在将它重启
# RESTARTS 重启次数(Pod服务出错,k8s会尝试进行重启)
# AGE Pod的年龄(创建了多久)
Pod相关操作
# 获取当前命名空间下的所有Pod
kubectl get pods
# 获取所有命名空间下的Pod
kubectl get pod -A
# 查看一个pod的信息(执行流程和故障码等)
kubectl describe pod <pod的name> -ns 命名空间名称
# 删除pod
kubectl delete pod <pod 的 NAME>
# 查看pod的日志信息
kubectl logs <podName>
# 查看pod的IP节点等详细信息等(需要补充完整)
kubectl get pod -owide
创建Pod的两种方式
# 命令创建
kubectl run pod <podName> --image=<镜像名称>
# yaml文件创建
apiVersion: v1
kind: Pod
metadata:
labels:
run: mynginx
name: mynginx
namespace: default
spec:
containers:
- image: nginx
name: mynginx
# yaml文件创建 一个Pod内部有多个容器
apiVersion: v1
kind: Pod
metadata:
labels:
run: myapp
name: myapp
spec:
containers:
- image: nginx
name: nginx
- image: tomcat:8.5.68
name: tomcat
# 执行命令
kubectl apply -f <yaml文件名称>
每个Pod会对应一个IP地址
ps:同一个Pod如果多个容器占用一个端口会造成Pod启动失败而不断重启
3.Deployment(部署)
控制Pod,使Pod拥有多副本,自愈,扩容缩容能力
# 创建一次deployment 选用tomcat镜像
kubectl create deployment mytomcat --image=tomcat:8.5.68
# 获取当前命名空间内的部署
kubectl get deployment
# 删除deployment
kubectl delete deployment <deployment名称>
deployment具有自愈能力,如果只是删除一次deployment中的某个pod deployment会自动进行恢复,需要删除deployment才有效
deployment的创建也可以使用yaml的方式
# 多副本创建
kubectl create deployment my-dep --image=nginx --replicas=3
# 多副本创建(yaml)
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: my-dep
name: my-dep
spec:
replicas: 3
selector:
matchLabels:
app: my-dep
template:
metadata:
labels:
app: my-dep
spec:
containers:
- image: nginx
name: nginx
# 集群的扩容和缩容 修改replicas的数字
kubectl scale --replicas=5 deployment/my-dep
# 集群的扩缩容,使用编辑yaml文件
kubectl edit deployment my-dep 修改replicas
版本控制
#历史记录
kubectl rollout history deployment/my-dep
#查看某个历史详情
kubectl rollout history deployment/my-dep --revision=2
#回滚(回到上次)
kubectl rollout undo deployment/my-dep
#回滚(回到指定版本)
kubectl rollout undo deployment/my-dep --to-revision=2
其他的工作负载
4.Service
将一组Pod公开为网络服务的抽象(Pod的路由)
#暴露Deploy
kubectl expose deployment my-dep --port=8000 --target-port=80
#使用标签检索Pod
kubectl get pod -l app=my-dep
#使用yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: my-dep
name: my-dep
spec:
selector:
app: my-dep
ports:
- port: 8000
protocol: TCP
targetPort: 80
1.ClusterIP(集群内部访问 默认)
# 等同于没有--type的
kubectl expose deployment my-dep --port=8000 --target-port=80 --type=ClusterIP
# yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: my-dep
name: my-dep
spec:
ports:
- port: 8000
protocol: TCP
targetPort: 80
selector:
app: my-dep
type: ClusterIP
2.NodePort(集群外部访问)
kubectl expose deployment my-dep --port=8000 --target-port=80 --type=NodePort
# yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: my-dep
name: my-dep
spec:
ports:
- port: 8000
protocol: TCP
targetPort: 80
selector:
app: my-dep
type: NodePort
NodePort范围在 30000-32767 之间