文章目录
本地minikube安装k8s集群
个人主机上安装和配置 kubernetes 有两个可选的套装
- kind: kind 让你能够在本地计算机上运行 Kubernetes。 kind 要求你安装并配置好 Docker。
-
- minikube: 与 kind 类似,minikube 是一个工具, 创建Minikube 虚拟机(VM)让你在本地运行 Kubernetes。
https://minikube.sigs.k8s.io/docs/start/
- minikube: 与 kind 类似,minikube 是一个工具, 创建Minikube 虚拟机(VM)让你在本地运行 Kubernetes。
Minikube 在本地机器上的 VM 内运行一个单节点 Kubernetes 集群
虚拟机内部的端口(默认为8443)
所以只能在本地直连,远程kubectl要连接需要其次将虚拟机内部的端口映射出来
# 下载linux最新的 minikube稳定版本
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 启动 Minikube 虚拟机(VM):
minikube start
## 查看 Minikube 虚拟机(VM)IP:
echo $(minikube ip)
minikube dashboard
# 查看服务
minikube service --all
# 停止 Minikube 虚拟机(VM):
minikube stop
# 删除 Minikube 虚拟机(VM):
minikube delete
生成环境建议用kubeadm 创建k8s
将 minikube 的服务暴露到宿主机外
minikube 虚拟出了一个 IP 作为自身的节点 IP(minikube ip),(minikube ip) 和宿主机不同。对于 NodePort 类型的 Service 也没有办法通过 127.0.0.1 访问。
- ssh代理
- k8s转发
kubectl port-forward --address 0.0.0.0 service/<service-name> <宿主机端口>:<minikube端口>
minikube安装问题记录
- 执行
minikube start
报错:Exiting due to DRV_AS_ROOT: The “docker” driver should not be used with root privileges.
解决方法:不用root用户运行,或启动改为minikube start --force --driver=docker
成功:Done! kubectl is now configured to use “minikube” cluster and “default” namespace by default
kubectl操作k8s
操作k8s集群可以分为两种方式:
- 使用kubectl命令行工具;
- 通过Dashboard页面可视化操作。
Dashboard在k8s上是以插件的方式安装,集群出现问题时可能无法正常显示,还需要使用kubectl命令行工具来排查问题,并且命令行的方式效率很高,
因此kubectl的安装与配置是管理员必须要掌握的。
安装kubectl
kubectl本身只是一个可执行文件, 只需配置环境变量即可使用
一般语法
https://www.kubernetes.org.cn/doc-45
kubectl [command] [TYPE] [NAME] [flags]
- command是您要执行的操作
例如create、expose、run、get、describe、logs、exec、delete - type是Kubernetes资源类型
例如namespace、services、deployment、pod - name是资源的具体名称
例如app_frontend - flags是您要包含的任何可选标志
连接k8s集群
- 创建一个配置文件, 配置k8s集群地址、用户密码、上下文
apiVersion: v1
kind: Config
clusters:
- name: "test1" # 集群名称、下面的contexts里面的cluster:value值对应
cluster:
server: "https://test.com/k8s/clusters/a-99abr"
- name: "test2"
cluster:
server: "https://test.com/k8s/clusters/b-99abr"
users:
- name: "root" # 用户名称、下面的contexts里面的user:value值对应
user:
token: "****"
contexts:
- name: "contexts1" # 上下文名称、在命令行中做集群切换时会用到
context:
user: "root"
cluster: "test1"
- name: "contexts2" # 上下文名称、在命令行中做集群切换时会用到
context:
user: "root"
cluster: "test2"
current-context: "contexts1" # 当前正在使用的上下文名称、表示kubectl连接的集群为test1
- 配置名为KUBECONFIG的环境变量,路径指向config文件
- 执行命令查看集群信息
kubectl cluster-info
切换上下文
# 显示k8s配置文件
kubectl config view
# 查看当前上下文
kubectl config current-context
kubectl config get-contexts
# 修改当前上下文
kubectl config use-context [contextsName]
操作k8s集群
查看 资源
# 列出资源
kubectl get [资源TYPE]
# namespace、services、deployment、pod
kubectl get all
# 显示有关资源的详细信息
kubectl describe [资源TYPE]
# 打印 pod 和其中容器的日志
kubectl logs [pod]
# 在 pod 中的容器上执行命令
kubectl exec [pod]
namespace
# 当前ns
kubectl config view --minify | grep namespace
# 切换ns
kubectl config set-context --current --namespace=<namespace>
创建Deployment、暴露Service
# 创建 Deployment
kubectl create deployment hello-node --image=registry.k8s.io/echoserver:1.4
# 查看 Deployment:
kubectl get deployments
# 创建 Service
kubectl expose deployment hello-node --type=[spec.type] --port=8080
# ClusterIP、NodePort、LoadBalancer、
# 获取minikube提供的Service访问地址
minikube service hello-node
## 访问services
curl URL
# 删除services
kubectl delete services hello-node
# 删除deployment
kubectl delete deployment hello-node
通过yaml部署
kubectl create -f nginx-deployment.yaml --dry-run
kubectl apply -f nginx-deployment.yaml
扩缩pod
# 修改deployments的replicas
kubectl scale deployments/hello-node --replicas=2
- 查看多pod的service负载均衡
kubectl describe service/hello-node
更新pod的Image
通过使用新的实例逐步更新 Pod 实例,零停机进行 Deployment 更新
服务将在更新期间仅对可用的 pod 进行负载均衡
# 查看当前Image:
kubectl describe pods
# Containers:
# echoserver:
# Image: XXX:v1
# 更新Image
kubectl set image deployments/hello-node XXX:v2
回滚
kubectl rollout undo deployments/hello-node
访问pod
# 通过podName访问
kubectl exec -i -t [podName] -- /bin/bash
# 可指定命名空间namespace
kubectl exec -i -t [podName] -n [namespace] -- bash
拷贝pod文件
# 复制文件
kubectl cp <pod-name>:path/to/remote/file /path/to/local/directory
# 复制目录
kubectl cp -r <pod-name>:path/to/remote/directory /path/to/local/directory
# 本地到pod
kubectl cp /path/to/local/file <pod-name>:path/to/remote/directory
注:<pod-name>:后不支持绝对路径,要用登录进pod时的相对路径, 而且不能包含驱动器号, 如果文件位于子目录中,则路径需要包含斜杠,但不能包含反斜杠
labels
# 查询指定labels的pod
kubectl get pod -l [labels]
# 查询指定labels的services
kubectl get services -l [labels]
# 给pod加labels
kubectl label pods [podName] [labels]
ConfigMaps、Secret
为 docker 容器设置环境变量
- 设置ConfigMaps、Secret
kubectl create configmap sys-app-name --from-literal name=my-system
kubectl create secret generic sys-app-credentials --from-literal username=bob --from-literal password=bobpwd
- 使用ConfigMaps、Secret
spec:
containers:
# Set the APP_NAME environment variable
env:
- name: APP_NAME
valueFrom:
configMapKeyRef:
name: sys-app-name
key: name
# Set the SYSTEM_APP_USERNAME and SYSTEM_APP_PASSWORD environment variables
env:
- name: SYSTEM_APP_USERNAME
valueFrom:
secretKeyRef:
name: sys-app-credentials
key: username
- name: SYSTEM_APP_PASSWORD
valueFrom:
secretKeyRef:
name: sys-app-credentials
key: password