🐇明明跟你说过:个人主页
🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅
🔖行路有良友,便是天堂🔖
目录
一、引言
1、Kubernetes简介
Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。它最初由 Google 开发,并于 2014 年开源,现由 Cloud Native Computing Foundation (CNCF) 维护。
核心功能:
1. 自动化部署和恢复
- Kubernetes 可根据配置文件快速部署应用,并在应用或节点发生故障时自动重启或调度到其他节点。
2. 弹性伸缩
- 支持根据负载自动扩展或缩减容器副本数量,提升资源利用率。
3. 负载均衡和服务发现
- 自动分配流量到不同的容器实例,确保服务高可用并支持服务间自动发现。
4. 存储编排
- 支持多种存储后端(本地存储、云存储、NFS、Ceph 等),可根据需求挂载存储卷。
5. 滚动更新和回滚
- 支持应用的滚动更新,确保更新过程不中断;若出现问题,可以快速回滚到稳定版本。
6. 配置管理和机密管理
- 使用 ConfigMap 和 Secret 管理配置数据和敏感信息,简化应用部署。
2、安装Kubernetes
关于k8s安装,请参考:
《深度解析:Kubernetes 1.28.2集群安装过程中的关键步骤》
二、Kubernetes集群管理命令
1、kubectl:K8s命令行工具介绍
kubectl 是 Kubernetes 的命令行工具,用于管理 Kubernetes 集群和应用。通过 kubectl,我们可以部署应用、查看资源、创建/删除对象、排查问题等,是 Kubernetes 集群日常运维的重要工具。
基本语法
kubectl [command] [TYPE] [NAME] [flags]
- command:要执行的操作(如 get、describe、create、delete 等)。
- TYPE:资源类型(如 pod、service、deployment 等,支持缩写)。
- NAME:资源名称,省略则对所有资源执行操作。
- flags:额外参数,影响命令行为(如 -n 指定命名空间,-o 指定输出格式)。
2、使用kubectl查看集群状态
查看集群信息:
kubectl cluster-info
输出示例:
Kubernetes control plane is running at https://192.168.40.180:6443
CoreDNS is running at https://192.168.40.180:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
- 显示 Kubernetes 控制平面和服务的访问地址。
- 如果有问题,输出可能为空或返回错误信息。
3、节点管理(添加、删除、查看节点)
查看节点
基本命令
kubectl get nodes
查看详细信息
kubectl describe node <node-name>
- 可以查看节点上的资源情况、状态、分配的 Pod 等详细信息。
查看节点的资源使用情况
kubectl top nodes
- 输出节点的 CPU 和内存使用情况,帮助了解节点的资源消耗。
添加节点
使用 kubeadm 添加节点
获取加入集群的命令(在主节点上执行):
kubeadm token create --print-join-command
输出示例:
kubeadm join 192.168.40.180:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
在新节点上执行输出的命令:
kubeadm join 192.168.40.180:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
验证节点是否加入集群: 回到主节点,执行:
kubectl get nodes
删除节点
从集群中删除节点
在主节点上执行以下命令:
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
kubectl delete node <node-name>
- kubectl drain 会驱逐节点上的 Pod,确保节点可以安全移除。
- kubectl delete node 从集群中移除节点信息。
在被删除的节点上清理状态
如果需要重新加入集群,先清理旧的 Kubernetes 配置:
kubeadm reset
rm -rf /etc/cni/net.d
rm -rf /var/lib/kubelet/*
rm -rf /var/lib/etcd/*
节点标记与污点管理
标记节点
为节点添加标签:
kubectl label node <node-name> <key>=<value>
示例:
kubectl label node node1 environment=production
查看节点标签
kubectl get nodes --show-labels
添加污点
kubectl taint nodes <node-name> <key>=<value>:<effect>
- effect 可以是 NoSchedule、PreferNoSchedule、NoExecute。
示例:
kubectl taint nodes node1 key1=value1:NoSchedule
4、创建、删除与切换命名空间
在 Kubernetes 中,命名空间(Namespace) 用于实现资源的逻辑隔离,适合在开发、测试和生产环境中组织和管理资源。
创建命名空间
方法一:使用 kubectl create 命令
kubectl create namespace <namespace-name>
示例:
kubectl create namespace dev
方法二:使用 YAML 文件
创建一个名为 namespace-dev.yaml 的文件:
apiVersion: v1
kind: Namespace
metadata:
name: dev
执行以下命令创建:
kubectl apply -f namespace-dev.yaml
查看命名空间
查看所有命名空间
kubectl get namespaces
示例输出:
NAME STATUS AGE
default Active 10d
kube-system Active 10d
kube-public Active 10d
dev Active 5m
查看某个命名空间的详细信息
kubectl describe namespace <namespace-name>
切换命名空间
设置默认命名空间
默认情况下,kubectl 操作资源是在 default 命名空间中。可以通过修改上下文切换到其他命名空间:
kubectl config set-context --current --namespace=<namespace-name>
示例:
kubectl config set-context --current --namespace=dev
验证当前上下文的命名空间:
kubectl config view --minify | grep namespace
删除命名空间
使用 kubectl delete 命令
kubectl delete namespace <namespace-name>
示例:
kubectl delete namespace dev
使用 YAML 文件
如果命名空间是通过 YAML 文件创建的,也可以使用以下命令删除:
kubectl delete -f namespace-dev.yaml
在指定命名空间中操作资源
指定命名空间创建或获取资源
在命名空间中创建资源:
kubectl create deployment nginx --image=nginx -n <namespace-name>
查看某个命名空间的所有 Pod:
kubectl get pods -n <namespace-name>
示例:
kubectl get pods -n dev
三、资源对象管理命令
1、kuberctl管理pod
1.1、创建 Pod
方法一:通过 kubectl run 命令
kubectl run <pod-name> --image=<image-name> --restart=Never
- --restart=Never 表示创建一个独立的 Pod,而不是 Deployment。
- --image=<image-name> 指定容器镜像,例如 nginx:latest。
示例:
kubectl run nginx-pod --image=nginx --restart=Never
方法二:使用 YAML 文件创建 Pod
编写一个 nginx-pod.yaml 文件:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: default
spec:
containers:
- name: nginx-container
image: nginx:latest
ports:
- containerPort: 80
执行以下命令创建 Pod:
kubectl apply -f nginx-pod.yaml
1.2、查看 Pod 状态
列出所有 Pod
kubectl get pods
查看指定 Pod 的详细信息
kubectl describe pod <pod-name>
示例:
kubectl describe pod nginx-pod
查看 Pod 的日志
kubectl logs <pod-name>
查看容器内多个容器的日志:
kubectl logs <pod-name> -c <container-name>
1.3、进入 Pod 容器内部
kubectl exec -it <pod-name> -- /bin/bash
示例:
kubectl exec -it nginx-pod -- /bin/bash
1.4、删除 Pod
方法一:通过命令删除
kubectl delete pod <pod-name>
示例:
kubectl delete pod nginx-pod
方法二:通过 YAML 文件删除
kubectl delete -f nginx-pod.yaml
1.5. 在指定命名空间管理 Pod
列出某个命名空间下的 Pod:
kubectl get pods -n <namespace-name>
在命名空间中创建 Pod:
kubectl run nginx-pod --image=nginx --restart=Never -n <namespace-name>
2、Deployments管理
2.1、创建 Deployment
方法一:使用 kubectl create 命令
kubectl create deployment <deployment-name> --image=<image-name>
示例:
kubectl create deployment nginx-deploy --image=nginx:latest
方法二:使用 YAML 文件创建 Deployment
编写一个 nginx-deployment.yaml 文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx:latest
ports:
- containerPort: 80
执行以下命令创建 Deployment:
kubectl apply -f nginx-deployment.yaml
2.2、查看 Deployment 状态
查看所有 Deployments
kubectl get deployments
查看指定 Deployment 的详细信息
kubectl describe deployment <deployment-name>
示例:
kubectl describe deployment nginx-deploy
2.3、更新 Deployment
方法一:直接更新镜像
kubectl set image deployment/<deployment-name> <container-name>=<new-image>
示例:
kubectl set image deployment/nginx-deploy nginx-container=nginx:1.21.0
方法二:修改 YAML 文件
编辑 nginx-deployment.yaml,将 image 修改为新的版本:
image: nginx:1.21.0
应用更新:
kubectl apply -f nginx-deployment.yaml
2.4、滚动更新状态
查看滚动更新状态
kubectl rollout status deployment/<deployment-name>
示例:
kubectl rollout status deployment/nginx-deploy
暂停和恢复滚动更新
kubectl rollout pause deployment/<deployment-name>
kubectl rollout resume deployment/<deployment-name>
2.5、回滚 Deployment
回滚到上一个版本
kubectl rollout undo deployment/<deployment-name>
回滚到指定修订版本
kubectl rollout undo deployment/<deployment-name> --to-revision=<revision-number>
查看修订历史
kubectl rollout history deployment/<deployment-name>
2.6、扩缩容 Deployment
命令行扩缩容
kubectl scale deployment <deployment-name> --replicas=<number>
示例:
kubectl scale deployment nginx-deploy --replicas=5
修改 YAML 文件扩缩容
在 nginx-deployment.yaml 中修改 replicas 数量:
spec:
replicas: 5
然后执行:
kubectl apply -f nginx-deployment.yaml
2.7、删除 Deployment
方法一:使用命令行
kubectl delete deployment <deployment-name>
示例:
kubectl delete deployment nginx-deploy
方法二:使用 YAML 文件
kubectl delete -f nginx-deployment.yaml
2.8、在命名空间中管理 Deployment
列出某个命名空间的 Deployments:
kubectl get deployments -n <namespace-name>
在指定命名空间中创建 Deployment:
kubectl create deployment nginx-deploy --image=nginx -n <namespace-name>
3、Services管理
3.1、Service 类型简介
- ClusterIP (默认类型):只能在集群内部访问,通常用于微服务之间的通信。
- NodePort:通过集群节点的固定端口(30000-32767)对外暴露服务。
- LoadBalancer:通过外部负载均衡器对外暴露服务(通常用于云服务)。
- ExternalName:将服务映射为外部域名。
3.2、创建 Service
方法一:使用 kubectl expose
kubectl expose deployment <deployment-name> --type=<service-type> --port=<port> --target-port=<target-port>
示例(创建一个 ClusterIP 类型的 Service,映射到 Nginx 的 80 端口):
kubectl expose deployment nginx-deploy --type=ClusterIP --port=80 --target-port=80
方法二:使用 YAML 文件创建
创建 nginx-service.yaml:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
执行命令创建 Service:
kubectl apply -f nginx-service.yaml
3.3、查看 Service 状态
列出所有 Service
kubectl get services
示例输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service NodePort 10.96.0.1 <none> 80:30001/TCP 5m
查看详细信息
kubectl describe service <service-name>
3.4、访问 Service
curl http://<NodeIP>:30001
3.5、更新 Service
修改 YAML 文件
修改 nginx-service.yaml,然后执行:
kubectl apply -f nginx-service.yaml
手动更新端口或类型:
kubectl edit service <service-name>
3.6、删除 Service
kubectl delete service <service-name>
示例:
kubectl delete service nginx-service
4、ConfigMaps管理
4.1、创建 ConfigMap
方法一:从命令行创建
kubectl create configmap <configmap-name> --from-literal=<key>=<value>
示例:创建一个包含数据库配置的 ConfigMap:
kubectl create configmap db-config --from-literal=username=root --from-literal=password=123456
方法二:从文件创建
kubectl create configmap <configmap-name> --from-file=<file-name>
方法三:使用 YAML 创建
configmap.yaml 示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
app.env: "production"
log.level: "info"
执行命令:
kubectl apply -f configmap.yaml
4.2、查看 ConfigMap
kubectl get configmap
kubectl describe configmap <configmap-name>
示例:
kubectl get configmap db-config -o yaml
4.3、在 Pod 中使用 ConfigMap
方式一:作为环境变量
apiVersion: v1
kind: Pod
metadata:
name: configmap-example
spec:
containers:
- name: my-container
image: nginx
env:
- name: USERNAME
valueFrom:
configMapKeyRef:
name: db-config
key: username
方式二:作为挂载的文件
apiVersion: v1
kind: Pod
metadata:
name: configmap-volume-example
spec:
containers:
- name: my-container
image: nginx
volumeMounts:
- name: config-volume
mountPath: "/etc/config"
volumes:
- name: config-volume
configMap:
name: app-config
5、Secrets 管理
Secrets 用于存储敏感数据,例如密码、API 密钥等。数据以 Base64 编码存储。
5.1、创建 Secret
方法一:从命令行创建
kubectl create secret generic <secret-name> --from-literal=<key>=<value>
示例:
kubectl create secret generic db-secret --from-literal=username=root --from-literal=password=mysecretpassword
方法二:从 YAML 文件创建
secret.yaml 示例:
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: cm9vdA== # "root" 的 Base64 编码
password: bXlzZWNyZXRwYXNzd29yZA== # "mysecretpassword" 的 Base64 编码
执行命令:
kubectl apply -f secret.yaml
Base64 编码命令
echo -n 'myvalue' | base64
5.2、查看 Secret
kubectl get secrets
kubectl describe secret <secret-name>
注意:kubectl describe 不会显示 Base64 解码后的值。
若要查看解码后的值:
kubectl get secret <secret-name> -o jsonpath="{.data.<key>}" | base64 --decode
5.3、在 Pod 中使用 Secret
方式一:作为环境变量
apiVersion: v1
kind: Pod
metadata:
name: secret-env-example
spec:
containers:
- name: my-container
image: nginx
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-secret
key: username
方式二:作为挂载的文件
apiVersion: v1
kind: Pod
metadata:
name: secret-volume-example
spec:
containers:
- name: my-container
image: nginx
volumeMounts:
- name: secret-volume
mountPath: "/etc/secret"
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: db-secret
💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Kubernetes的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺
🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!