k8s之常用命令
Minikube
# 启动集群服务 minikube start # 查看集群服务状态 minikube status
# 登录集群
minikube ssh # 关闭,暂停,恢复,删除集群服务 minikube stop/pause/unpause/delete # 打开dashboard minikube dashboard # 操作节点(新增/删除/列表) minikube node add/delete/list # 插件管理 minikube addons list/enable/disable
minikube的服务暴露到宿主机:
minikube 是一款基于 Kubernetes 的定位于快速验证功能的小型容器编排环境。
由于它的定位特性,我们在使用中会发现 minikube 虚拟出了一个 IP 作为自身的节点 IP,该 IP 和宿主机不同。对于 NodePort
类型的 Service 也没有办法通过 127.0.0.1
访问。
Host 内访问
The minikube VM is exposed to the host system via a host-only IP address, that can be obtained with the
minikube ip
command.
我们必须通过 minikube ip
找到 minikube 的 IP 并通过它来访问 NodePort
类型的 service。
另外可以留意到 LoadBalancer
类型的 service 在默认情况下 external IP 为 <pending>
,为了要能够访问到 service,需要通过
minikube tunnel
建立隧道和服务通信。在执行 minikube tunnel
后,可以发现 external IP 被设置成和 cluster IP 一样的值,这时候就可以通过 <minikube-ip>:<service-port>
来访问 service 了。
Host 外访问
通过 minikube 可以很方便地在本机访问,同时避免了对宿主机端口的占用。但是也带来了另一个问题:无法直接通过访问宿主机的端口来访问 services 进行调试。
比如我的实验机是一台云服务虚拟机,我在自己的电脑上可以访问这台虚拟机,但是不能访问虚拟机上 minikube 暴露的服务。
虽然没有办法让 minikube 直接通过宿主机端口对外暴露 services,但是如果我们把问题换个角度思考,就很容易找到解决办法:如何将一个 service(不特定类型)暴露到本机。
这时候最简单的办法就是通过 kubectl port-forward
转发端口。
假设我有 service/istio-ingressgateway
,service 监听 80 端口,我希望暴露在宿主机的 31303 端口,就可以使用以下命令1:·
kubectl port-forward --address 0.0.0.0 -n istio-system service/istio-ingressgateway 31303:80
常见问题:
1.启动插件发生错误
例如minikube addons enable ingress, 发生错误
解决方式: https://github.com/kubernetes/minikube/issues/13872
查看对应的pod启动是否启动, 我的就是因为镜像拉取失败导致
2.切换使用的驱动之后,发生启动服务错误的问题
GUEST_PROVISION: Failed to cache ISO: unable to cache ISO:
minikube.exe config set driver virtualbox
解决:
删除之前创建的minikube实例,
先删除~/.minikube/* 然后再重新启动即可
Kubectl
[集群]
# 查看集群信息
kubectl cluster-info
[Node]
# 查看节点 kubectl.exe get node/nodes
[Pod]
# 查看Pod kubectl get po/pod/pods -A: 全部 -n: 指定命名空间; kube-system -o: 输出格式(json/yaml/wide ...), 查看更多信息,例如端口信息可使用wide -w: 检测观察 -l: 指定标签 key1=value1,key2=values 默认是不显示kube-system下的Pod # 显示详细信息 kubectl describe pod_name # 打印Pod中容器的日志 kubectl logs pod_name # 在Pod中容器上执行命令 kubectl exec pod_name
# 进入Pod内的容器
kubectl exec -it nginx-pod /bin/bash
# 删除Pod
kubectl.exe delete -f .\nginx.yaml
kubectl delete pod nginx-pod
# 将本地端口与指定Pod进行端口映射
kubectl.exe port-forward nginx-pod 4000:80
[Service]
# 查看Service kubectl.exe get service/services # 清理 kubectl delete service service_name # 查看集群时间 kubectl get events # 查看kubectl配置 kubectl config view # 支持同时指定多个 kubectl get pod,svc -n kube-system
[Deployment]
# 查看Deployment kubectl.exe get deployment/deployments
# 发布
kubectl apply -f deployment.yaml
# 回滚
kubectl rollout undo deployment [deployment名称]
在 deployment 的资源定义中, spec.strategy.type
有两种选择:
- RollingUpdate: 逐渐增加新版本的 pod,逐渐减少旧版本的 pod。
- Recreate: 在新版本的 pod 增加前,先将所有旧版本 pod 删除。
大多数情况下我们会采用滚动更新 (RollingUpdate) 的方式,滚动更新又可以通过 maxSurge
和 maxUnavailable
字段来控制升级 pod 的速率,具体可以详细看官网定义。:
- maxSurge: 最大峰值,用来指定可以创建的超出期望 Pod 个数的 Pod 数量。
- maxUnavailable: 最大不可用,用来指定更新过程中不可用的 Pod 的个数上限。
# 查看历史版本
kubectl rollout history deployment hellok8s-deployment
# 回滚到指定版本
kubectl rollout undo deployment/hellok8s-deployment --to-revision=2
# 暴露端口
kubectl expose deployment hello-node --type=LoadBalancer --port=8080
[Namespace]
# 查看命名空间列表 kubectl.exe get ns
[Yaml]
# 查看不同的资源类型对应的apiVersion版本是多少 kubectl api-resources -o wide 列出对应的资源的简写和对应的版本信息 NAME:资源名称 SHORTNAMES:资源名称简写 APIGROUP:就是apiVersion NAMESPACED:是否需要指定名称空间 KIND:资源类型 VERBS:可用的方法 # 获取指定api组的api资源 kubectl api-resources --api-group apps # 查看支持的所有api kubectl api-versions # 获取指定资源的版本信息 kubectl explain deployment
Kubelet
Kubeadm