- 常用命令
shell
kubectl [command ] [type] [name] [flags]
command:
create
get
describe
delete
type:
pod
pods
name
eg:
kubectl get pods ,svc
kubectl --help
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get nodes
kubectl apply -f *.yml
kubectl api-versions
kubectl api-resources
-- 生成 yml
kubectl create deployment web --image=nginx -o yaml --dry-run
kubectl get deploy nginx -o=yaml --export > m2.yml
# 给节点打标签
kubectl label node node1 env_role=dev
kubectl get nodes --show-labels
kubectl get pods -o wide
# 污点
kubectl describe node master |grep Taint
kubectl taint node [node] key=val
# 删除pod
kubectl delete deployment web
kubectl get secret
# 创建命名空间
kubectl create namespace idms;
# 查看 命名空间
kubectl get ns ;
kubectl get role;
plsql
# 列出所有不同的资源对象,默认default空间
kubectl get all
# 查看defalut空间下的所有资源
kubectl get all -n default
# 列出所有节点
kubectl get nodes
# 列出所有节点及详情
kubectl get nodes -o wide
# 实时查看
kubectl get pods -o wide -w
# 列出所有节点详情及标签信息
kubectl get nodes -o wide --show-labels
# 列出所有命名空间下运行的Pod信息
kubectl get pods --all-namespaces
# 列出所有运行的Pod信息
kubectl get pods
# 列出所有运行的Pod信息及详情
kubectl get pods -o wide
# 列出所有的命令空间
kubectl get namespace
# 列出所有replication controllers和service信息
kubectl get rc,services
# 查看test下的service资源,Cluster IP,Service的直接IP地址,此为虚拟IP地址。外部网络无法ping通,只有kubernetes集群内部访问使用。
kubectl get svc -n test
plsql
# 从文件或标准输入创建资源,接受JSON和YAML格式。
kubectl create -f FILENAME
# 根据aaa.text创建一个名为my-config的configmap
kubectl create configmap my-config --from-file=/root/aaa.text
# 创建一个名为test-namespace的命名空间,可缩写为ns
kubectl create namespace test-namespace
# 在test命名空间下,创建一个名为test-nginx的deployment资源
kubectl create deployment test-nginx --image=daocloud.io/library/nginx:1.7.11 -n test
plsql
# 语法
run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [--command] -- [COMMAND] [args...]
# 在test-namespace命名空间下创建nginx,执行端口88,副本数为2
kubectl run nginx --image=daocloud.io/library/nginx:1.7.11 --port= 88 --replicas=2 --env="POD_NAMESPACE=test-namespace"
plsql
# 语法
$ delete ([-f FILENAME] | TYPE [(NAME | -l label | --all)])
# 使用nginx-test.yml中指定的资源类型和名称删除pod
kubectl delete -f ./nginx-test.yml
# 删除一个pod
kubectl delete pod test-nginx-cc44fcc54-hhfgv -n test
# 删除所有的pod
kubectl delete pods --all
# 删除命名空间
kubectl delete namespace test-namespace
plsql
# 语法
kubectl describe TYPE NAME_PREFIX
# 查看名为test-nginx的详细信息
kubectl describe deployment test-nginx -n test
# 查看名为test-nginx的svc的详细信息
kubectl describe svc test-nginx -n test
# deployment名称
Name: test-nginx
# 所属命名空间
Namespace: test
# 创建时间
CreationTimestamp: Mon, 02 Nov 2020 22:21:59 +0800
# 标签,此处是默认添加,Label具有严格的命名规则,它定义的是Kubernetes对象的元数据(Metadata),并且用于Label Selector。
Labels: app=test-nginx
# Annotation则是用户任意定义的“附加”信息,以便于外部工具进行查找。
Annotations: deployment.kubernetes.io/revision: 1
# 标签选择器,Kubernetes核心的分组机制,通过label selector客户端/用户能够识别一组有共同特征或属性的资源对象
Selector: app=test-nginx
# 副本数 期望1,已更新1,总计1个,1个可用,0个不可用
Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
# 更新策略-滚动更新(重建(recreate)/滚动更新(rolling-update)蓝绿(blue/green)金丝雀(canary)A/B测(a/b testing))
StrategyType: RollingUpdate
# 升级等待时间
MinReadySeconds: 0
# 滚动更新策略,unavailable升级过程中最多有多少个POD处于无法提供服务的状态,surge升级过程中最多可以比原先设置多出的POD数量
RollingUpdateStrategy: 25% max unavailable, 25% max surge
# pod模板
Pod Template:
标签
Labels: app=test-nginx
容器
Containers:
容器nginx
nginx:
镜像地址
Image: daocloud.io/library/nginx:1.7.11
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: test-nginx-cc44fcc54 (1/1 replicas created)
# 事件
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 16m deployment-controller Scaled up replica set test-nginx-cc44fcc54 to 1
plsql
# 语法
kubectl exec POD [-c CONTAINER] -- COMMAND [args...]
#
kubectl exec -it podName -c cName /bin/bash -n test
plsql
# 语法
expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type]
# 为deployment的test-nginx创建service,并通过Service的80端口转发至容器的80端口上,service接入点不变
kubectl expose deployment test-nginx --port=80 --target-port=80 -n test
plsql
# 语法
scale [--resource-version=version] [--current-replicas=count] --replicas=COUNT (-f FILENAME | TYPE NAME)
# 扩容test-nginx为2份
kubectl scale deployment test-nginx --replicas=2 -n test
shell
#namespace 和nacos 的 namespace
名称空间 隔离资源 不隔离网络
## 查看 所有名称空间的 pod
kubectl get pods -A
# 查看 指定名称空间的 pod
kubectl get pods -n kube-system
# 创建 pod
kubectl run mynginx --image=nginx --port=80
kubectl describe pod mynginx
kubectl delete -f pod.yml
kubectl logs mynginx
kubectl exec -it mynginx -n idms -- /bin/bash
shell
apiVersion: v1
kind: Namespace
metadata:
name: hello
shell
apiVersion: v1
kind: Pod
metadata:
# pod 的名字
name: mynginx
# 指定命名空间 可选
namespace: idms
labels:
run: mynginx
spec:
containers:
- image: nginx
name: mynginx
# kubectl run mynginx --image=nginx --port=80
# kubectl describe pod mynginx
# kubectl describe pod mynginx -n idms
# kubectl delete -f pod.yml
# kubectl logs mynginx
# kubectl exec -it mynginx -n idms -- /bin/bash
shell
apiVersion: v1
kind: Pod
metadata:
# pod 的名字
name: mypod
# 指定命名空间 可选
spec:
containers:
- image: nginx
name: mynginx
- image: tomcat
name: tomcat
# kubectl run mynginx --image=nginx --port=80
# kubectl describe pod mynginx
# kubectl describe pod mynginx -n idms
# kubectl delete -f pod.yml
# kubectl logs mynginx
# kubectl exec -it mynginx -n idms -- /bin/bash
dashboard 搭建
shell
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
# kubectl get secret -n kube-system|grep admin|awk '{print $1}'
# kubectl describe secret dashboard-admin-token-86qqf -n kube-system|awk '/^token/ {print $2}'
# kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template='{{.data.token | base64decode}}'
kubectl apply -f dash.yml 执行命令 创建pod
shell
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
type修改为 NodePort
kubectl get svc -A | grep kubernetes-dashboard
通过命令获得token 登录
shell
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template='{{.data.token | base64decode}}'
delpoy
shell
# 创建一次部署
kubectl create deployment mynginx --image=nginx:1.14
# 删除部署
kubectl delete deploy mynginx
# 删除pod deployment 具备自愈性 会重新创建新的pod
# kubectl delete pod mynignx-001
# 多副本 1.19 版本可以用
kubectl create deployment mynginx --image=nginx:1.14 --replicas=2
# 通过yml 部署
kubectl create -f repla.yml
# 扩容 缩容 --replicas = 总的容量
kubectl scale deploy/mynginx --replicas=8
# 滚动升级
kubectl set image deploy/mynginx nginx=nginx:1.16 --record
# 回退
# 查看版本记录
kubectl rollout history deploy/mynginx
## 查看版本记录指定版本
kubectl rollout history deploy/mynginx --revision=2
## 回滚到上次
kubectl rollout undo deploy/mynginx
## 指定版本号回退
kubectl rollout undo deploy/mynginx --to-revision=3
shell
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: mynginx
name: mynginx
spec:
replicas: 2
selector:
matchLabels:
app: mynginx
template:
metadata:
labels:
app: mynginx
spec:
containers:
- image: nginx
name: mynginx
shell
# 将多个pod 组成一个对外发布服务 实现了 服务发现和负载均衡
kubectl expose deploy mynginx --port=8000 --target-port=80
# kubectl expose deploy mynginx --port=8000 --target-port=80 --type=NodePort
# 通过 service 访问 多台机器
# 服务名.名称空间.svc
# mynginx.default.svc
# mynginx.default.svc:8000
#配置文件方式
apiVersion: v1
kind: Service
metadata:
name: mynginx
labels:
app: mynginx
spec:
selector:
app: mynginx
ports:
- port: 8000
targetPort: 80
protocol: TCP
# kubectl get pod -l app=mynginx
每一个pod中都包含若干个 容器 和一个父容器 父容器主要负责监控 和网络
python
# 查询 pod 可以配置的属性和清单
kubectl explain pod
kubectl explain pod.metadata
kubectl api-versions
pod 的创建过程
重启策略
pod 的调度 由 Scheduler组件 采用相应的算法实现的 四大调度规则: 自动调度 默认的 定向调度 通过NodeName 配置 调度到指定的机器
python
apiVersion: v1
kind: Pod
metadata:
name: mynginx
spec:
# 通过 nodeName 指定节点名称 定向调度
nodeName: node1
containers:
- image: nginx # 镜像名称
name: mynginx # 容器名称
imagePullPolicy: never
nodeSelector
python
#先给 节点node 打标签
kubectl label nodes node1 node-env=dev
----------------------------------------------
通过 nodeSelector 选择节点
apiVersion: v1
kind: Pod
metadata:
name: mynginx
spec:
# 通过 nodeName 指定节点名称 定向调度
# nodeName: node1
nodeSelector:
node-env: dev
containers:
- image: nginx # 镜像名称
name: mynginx # 容器名称
imagePullPolicy: never
亲和性调度 NodeAffinity podAffinity PodAntiAffinity 污点调度(容忍调度) Taints Toleration
python
# 给节点1设置污点 并且 新建的pod 不会在调度到 node1
# NoSchedule 新建的pod 不会在调度到 node1
# NoExecute 新建的pod 不会在调度到 node1 并且原有的pod 会终止运行
# PreferNoSchedule 尽量调度到node1 除非没有其他的节点
kubectl taint nodes node1 node-env=dev:NoSchedule
# 移除污点
kubectl taint nodes node1 node-env:NoSchedule-
kubectl taint nodes node1 node-env:NoExecute-
kubectl taint nodes node1 node-env:NoExecute-
# 查看污点信息
# kubectl describe node node1
容忍的配置
python
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
# 容忍
# 把pod 调度到 具备 指定污点的node上
tolerations:
- key: "node-env"
operator: "Equal"
value: "dev"
effect: "NoSchedule"
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
protocol: TCP
job
kubectl get job -owide -w # -w 监控 存储