基础命令-kubectl
查看命令
## 查看集群信息
kubectl cluster-info
kubectl cluster-info dump
## 查看集群各服务信息
kubectl get cs
## 查看集群证书请求信息
kubectl get csr
## 批准证书
kubectl certificate approve node-csr-GOt-4QjBYgU9iN0V05ZCOxmK8wfwve50u_n0erxEeCc
## 查看k8s集群节点
kubectl get node
##
kubectl get sa --all-namespaces
##
kubectl describe sa --all-namespaces
##
kubectl get rolebinding --all-namespaces
## 列出所有已存在资源
kubectl get all
## 列出指定命名空间下已存在资源
kubectl get all -n kube-system
## 列出所有命名空间
kubectl get ns
## 查看k8s集群default命名空间下的pod
kubectl get pod
## 查看指定命名空间下的pod
kubectl get pod -n kube-system
## 查看k8s集群所有命名空间下的pod
kubectl get pod --all-namespaces
## 查看default命名空间下pod运行信息
kubectl get pod -o wide
## default命名空间下查看指定pod运行信息
kubectl get pod/nginx -o wide
## 查看所有命名空间下pod运行信息
kubectl get pod --all-namespaces -o wide
## 查看default命名空间下指定pod详细信息
kubectl describe pod/nginx
## 查看所有命名空间下pod详细信息
kubectl describe --all-namespaces pod
## 查看指定命名空间下pod详细信息
kubectl describe -n default pod/nginx
kubectl describe -n kube-system pod/kube-flannel-ds-amd64-nw6md
## 查看ip和端口
kubectl get ep
## 查看标签
kubectl get pod --show-labels
## 通过标签查看pod
kubectl get pod -n web -l run=nginx
## 发布服务
kubectl expose pod/nginx --port=88 --target-port=80 --type=NodePort
## 查看指定pod日志
kubectl logs pod/nginx
## 查看服务发布信息
kubectl get svc
kubectl explain --help
关键参数
get: 获取相关信息,后面可以加-o wide
describe: 获取详细信息
-n: 指定命名空间
-l: 指定标签,例如web=nginx
操作命令
## 授权帐号
kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap
## 批准证书
kubectl certificate approve node-csr-GOt-4QjBYgU9iN0V05ZCOxmK8wfwve50u_n0erxEeCc
## 创建命名空间
kubectl create namespace web
## 创建一个nginx示例并指定web命名空间
kubectl run nginx -n web --image=nginx
## 查看指定命名空间下pod详细信息
kubectl describe -n web pod/nginx
# 编辑pod/nginx
kubectl edit -n web pod/nginx
## 创建一个deployment
kubectl create deployment nginx --image=nginx
## 发布
kubectl expose deployment/nginx --port=80 --type=NodePort --target-port=80 --name=service-nginx
# 给容器添加标签
kubectl label -n web pod/nginx env_role=nginx
## 进入容器
kubectl exec -n web pod/nginx -c nginx -it -- bash -il
## 发布服务 --name=服务名称
kubectl expose -n web pod/nginx --port=88 --target-port=80 --type=NodePort --name=nginx-service
## 查看发布服务详细信息
kubectl describe -n web svc/nginx-service
#删除pod(有deploy时直接删除depoly)
kubectl delete -n web pod/nginx
#删除发布的服务
kubectl delete -n web svc/nginx-service
## 更新镜像
kubectl set image -n web pod/nginx nginx=nginx:1.12
## 更新镜像,并记录事件
kubectl set image -n web pod/nginx nginx=nginx:1.13 --record
pod/nginx image updated
## 或者
kubectl edit -n web pod/nginx
# 修改
containers:
- image: nginx:1.13
//不指定-n就是默认命名空间default
kubectl run busybox --image=busybox --command -- ping www.baidu.com
## deployment相关操作
# 查看deploy信息-指定命名空间
kubectl get deploy -n kubernetes-dashboard
# 查看指定pod详细信息
kubectl describe deploy/kubernetes-dashboard -n kubernetes-dashboard
# 设置副本为2,并记录
kubectl scale deploy kubernetes-dashboard -n kubernetes-dashboard --replicas=1 --record
## rollout 用法
# 查看发布状态
kubectl rollout status deploy/kubernetes-dashboard -n kubernetes-dashboard
# 通过rollout history查看操作记录
kubectl rollout history deploy/kubernetes-dashboard -n kubernetes-dashboard
# 通过rollout undo回滚-默认回滚到上一个版本
kubectl rollout undo deploy/kubernetes-dashboard -n kubernetes-dashboard
# 回滚到指定版本
kubectl rollout undo deploy/kubernetes-dashboard -n kubernetes-dashboard --to-revision=2
部署相关
# 应用
kubectl apply -f xxxx.yaml
# 创建
kubectl create -f xxxx.yaml
# 删除
kubectl delete -f xxxxx.yaml
# 重新生成=delete+create
kubectl replace -f xxxxx.yaml
YAML文件配置
## 要使用最新的版本
kubectl api-versions
示例:
编辑deploy.yaml
vim nginx-depolyment.yaml
apiVersion: apps/v1 #当前格式的版本
kind: Deployment #当前创建资源的类型, 当前类型是Deployment
metadata: #当前资源的元数据
name: nginx-deployment #当前资源的名字 是元数据必须的项
namespace: web
labels:
web: nginx
spec: #是当前Deployment的规格说明
replicas: 3 #指当前创建的副本数量 默认不填 默认值就为‘1’
selector:
matchLabels:
app: nginx
template: #定义pod的模板
metadata: #当前pod的元数据
labels: #至少顶一个labels标签,可任意创建一个 key:value
app: nginx
spec: #当前pod的规格说明
containers: #容器
- name: nginx #是容器的名字容器名字是必须填写的
image: nginx:1.16 #镜像 镜像的名字和版本
ports:
- containerPort: 80
编辑service.yaml
vim nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: web
labels:
web: nginx
spec:
selector:
app: nginx
ports:
- port: 88
targetPort: 80
nodePort: 30008
type: NodePort
注意: 这里的spec下的selector要和deployment.yaml中的对应上,nodePort端口要在aipserver配置文件里设置的端口范围之内
部署
## 部署
kubectl create -f nginx-depolyment.yaml
kubectl create -f nginx-service.yaml
## 查看部署信息
get all -n web
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-767cbb69b8-482j2 1/1 Running 0 3m35s
pod/nginx-deployment-767cbb69b8-8prkz 1/1 Running 0 3m35s
pod/nginx-deployment-767cbb69b8-mrbsj 1/1 Running 0 3m35s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 3/3 3 3 3m35s
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-767cbb69b8 3 3 3 3m35s
## 通过标签查看deploy
kubectl get deploy -n web -l web=nginx
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 11m
## 查看服务发布情况
kubectl get svc -n web -l web=nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service NodePort 10.0.0.116 <none> 88:30627/TCP 29s
kubectl describe svc -n web -l web=nginx
Name: nginx-service
Namespace: web
Labels: web=nginx
Annotations: <none>
Selector: app=nginx
Type: ClusterIP
IP: 10.0.0.116
Port: <unset> 88/TCP
TargetPort: 80/TCP
Endpoints: 10.244.1.12:80,10.244.2.21:80,10.244.2.22:80
Session Affinity: None
Events: <none>
## 访问测试
curl http://10.0.0.116:88
## 更新版本,将配置文件里的nginx:1.16修改为nginx:latest
kubectl replace -f nginx-depolyment.yaml
Pod管理
节点绑定
Pod.spec.nodeName 强制约束pod调度到指定的node节点
Pod.spec.nodeSelector 通过lable-selector机制选择节点
重启机制
Always: 当容器停止,总是重建容器,默认策略
OnFailure: 当容器异常退出(退出状态码非0)时,才重启容器
Never: 当容器终止退出,从不重启容器
pod健康检查
probe机制,有两种类型
livenessProbe
如果检查失败,将杀死容器,根据pod的restartPolicy操作
readinessProbe
如果检查失败,Kubenetes会把pod从service endpoints中删除
Probe支持以下三种检查方法
httpGet
发送HTTP请求,返回200-400范围状态码为成功
exec
执行shell命令返回状态码为0为成功
例如: [ -e pidfile ] && echo 0 || echo 1
tcpSocket
发起TCP Socket建立成功
yaml配置文件示例
示例: busy.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
labels:
app: busybox
spec:
containers:
- name: busybox
image: busybox
ports:
command:
- ping
- "www.baidu.com"
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
restartPolicy: Always
示例: nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: web
# 标签
labels:
app: nginx
spec:
# 节点绑定
# nodeNmae: node01
nodeSelector:
env_role: dev
containers:
- name: nginx
image: nginx
ports:
- protocol: TCP
containerPort: 80
# 资源限制
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
restartPolicy: OnFailure
问题定位
kubectl describe TYPE NAME_PREFIX
kubectl logs pod/xxx
kubectl exec -it pod/xxx /bin/bash
Service代理模式与负载均衡
- 网络代理
- 服务代理
- 服务发现
- 发布服务
yaml配置文件
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: web
labels:
web: nginx
spec:
selector:
app: nginx
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
- name: https
protocol: TCP
port: 443
targetPort: 443
selector: 选择器,通过标签来匹配后端应用,做负载均衡
ports: 要暴露的后端端口,会分配一个clusterIP,并分配一个port
如果一个svc创建两个端口映射,需要-name来区分
-
apiVersion: 指定版本
-
kind: 类型
-
name: 指定服务名称
-
labels: 标签
-
port: Service 服务暴露的端口
-
targetPort: 容器暴露的端口
-
seletor: 关联的Pod的标签
如果需要在宿主机上暴露端口,需要加入type: NodePort,并指定nodePort:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: web
labels:
web: nginx
spec:
selector:
app: nginx
ports:
- port: 88
targetPort: 80
# 这个一般不去指定,会生成一个随机端口,端口范围在apiserver配置文件中指定
nodePort: 30008
type: NodePort
通过kubectl get svc 查看,会发现TYPE类型变为NodePort,然后访问node的真实ip加nodePort端口即可访问pod服务
kubectl get svc -n web
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service NodePort 10.0.0.150 <none> 88:30008/TCP 3m20
Service-服务发现
-
环境变量
当一个pod运行到Node,kubelet会为每个容器添加一组环境变量,Pod容器中程序就可以使用这些环境变量发现Service.
环境变量格式如下:
(SVCNAME)_SERVICE_HOST
(SVCNAME)_SERVICE_PORT
限制:
1). Pod和Service的创建顺序是有要求的,Service必须在Pod创建之前被创建,否则环境变量不会被设置到Pod中
2). Pod只能获取同Namespace中的Service环境变量
-
DNS
DNS服务监视Kubernetes API,为每一个Service创建DNS记录用于域名解析,这样Pod中就可以通过DNS域名获取Service的访问地址
服务类型
-
ClusterIP
分配一个内部集群IP地址,只能在集群内部访问(通Namespace内的pod),默认ServiceType.
-
NodePort
分配一个内部集群IP地址,并在每个节点上启用一个端口来暴露服务,可以在集群外部访问
访问地址: :
-
LoadBalancer
分配一个内部集群IP地址,并在每个节点上启用一个端口来暴露服务.
除此之外,Kubernets会请求底层云平台上的负载均衡,将每个Node([NodeIP]:[NodePort])作为后端添加进去