本文来自于要将国内的一个项目迁移到海外,剥离国内公司域内的各种依赖,海外环境提供k8s部署环境,因此需要学习k8s。 本地学习k8s最好方式就是在本地搭建一个minikube集群,mimikube提供了全套的kubectl命令支持,功能十分强大,此文章记录其中比较重要的命令,以备查询

文章资料来源于官网https://minikube.sigs.k8s.io/docs/start/

minikube基础指令

  • 启动一个本地集群
1
minikube start
  • 启动dashboard
1
2
minikube dashboard  #退出后,dashboard也推出了
nohup minikube dashboard & #窗口退出后,dashboard还有效
  • 停止集群
1
minikube stop
  • 删除集群
1
minikube delete
  • 删除所有集群
1
minikube delete --all

缓存镜像

minikube不使用宿主机已有镜像

1
2
3
4
5
6
7
8
9
# minikube cache add image:tag # 适用该指令将镜像添加到minikube的缓存镜像库
# $MINIKUBE_HOME/cache/images, 在我本机,缓存地方:~/.minikube/cache/images
minikube image load image:tag
# 更新
minikube cache reload
# 查看本地缓存的镜像
minikube cache list
# 删除本地缓存镜像
minikube cache delete <image name>

更多方案见https://minikube.sigs.k8s.io/docs/handbook/pushing/

发布服务

  • 使用minikube

在minikube上面发布成服务,type为LoadBalancer时,external-ip会显示为<pending>, 此时可以使用指令

1
minikube service <service-name> # 会打开一个浏览器进行访问服务
  • 或者使用kubectl
1
kubectl port-forward service/<service-name> <host-port>:<service-port> # 可以使用宿主机:host-port进行服务访问
  • 使用tunnel

另起一个终端,执行指令minikube tunnel,然后在查看服务详情,kubectl get services可以看到服务的EXTERNAL-IP ,此时可以通过服务的EXTERNAL-IP:service-port进行访问

停止该终端后,服务EXTERNAL-IP会变为<pending>

1
minikube tunnel runs as a process, creating a network route on the host to the service CIDR of the cluster using the cluster’s IP address as a gateway. The tunnel command exposes the external IP directly to any program running on the host operating system.

配置

设置minikube使用内存大小

1
2
minikube config set memory 4096
These changes will take effect upon a minikube delete and then a minikube start

插件

  • 显示插件列表
1
minikube addons list
  • 启用插件
1
minikube addons enable <name>
  • 禁用插件
1
minikube addons disable <name>

kubectl常用命令

针对所有资源类型,都可以使用kubectl create/get/delete/describe/edit {{source_type}}进行访问 资源类型有namespace,node,pod,replicaset,deployment,service,configmap 也可以使用命令kubectl get all 获取所有资源

可选的OPTIONS,一般选择-o wide展示更多信息

例如: kubectl get node 获取集群节点信息, -A获取全部节点信息

1
2
3
[root@VM-0-14-centos ~]# kubectl get node
NAME        STATUS   ROLES    AGE     VERSION
10.0.5.37   Ready    <none>   4d16h   v1.18.4-tke.9

我个人一般操作的资源有deployment,service,configmap

部署一个应用服务时,会提前写好三个配置文件,分别是configmap.yaml,deployment.yaml,service.yaml文件,然后使用命令 kubectl apply -f {{xx.yaml}} 创建资源,如果资源存在,则会执行更新

更新了deployment后,可以使用一下命令观察pod的变化 kubectl get pod {{deployment_name}} --watch

进入到pod容器中,观察容器内容 kubectl exec -it {{pod_name}} [ -c {{container_name}}] --bash 其中pod_name是期望进入的pod, container_namepod中容器名,如果不指定,则默认进入第一个容器中。

扩缩容 kubectl scale deployment {{deployment name}} --replica=N

  • configmap

更新configmap与操作pod,deployment等一致 使用kubectl get configmap获取configmap资源列表 使用kubectl describe configmap {{configmap name}} 查看资源的配置信息 使用kubectl edit configmap {{configmap name}} 修改资源的配置信息

  • 重启deployment

方法1:

kubectl scale deployment {{deployment name}} --replicas=0 kubectl scale deployment {{deployment name}} --replicas=N

方法2:

kubectl delete pod {{podname}} -n {namespace}

方法3:

kubectl get pod {podname} -n {namespace} -o yaml | kubectl replace --force -f -

方法4(推荐):

kubectl rollout restart deployment/pod {your_deployment_name}

k8s集群搭建

集群搭建好了,默认只在master节点上可以访问到集群,如果想在其他机器上访问,可以拷贝master节点上$HOME/.kube/config文件到该机器上对应目录即可访问

如果有多个集群可以访问,配置环境变量export KUBECONFIG={{config_path1}}:{{config_path2}}..., 查看某个配置下的usercontext, kubectl config view {{config_path}}。 k8s使用usercontext保存了某个集群上某个用户上下文,访问不同集群,也就是切换到某个用户上下文。 kubectl config use-context {{某个用户上下文}},切换不同集群,其中某个用户上下文就是上述命令kubectl config view {{config_path}}输出出来的结果。

docker相关

  • root身份运行docker docker exec --privileged -u root it {{容器名字}} {{cmd}}

  • 镜像历史及大小 docker history --no-truncdocker images --no-trunc