🐇明明跟你说过:个人主页
🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅
🔖行路有良友,便是天堂🔖
目录
一、引言
1、Kubernetes简介
2、安装Kubernetes
二、Kubernetes集群管理命令
1、kubectl:K8s命令行工具介绍
2、使用kubectl查看集群状态
3、节点管理(添加、删除、查看节点)
4、创建、删除与切换命名空间
三、资源对象管理命令
1、kuberctl管理pod
1.1、创建 Pod
1.2、查看 Pod 状态
1.3、进入 Pod 容器内部
1.4、删除 Pod
1.5. 在指定命名空间管理 Pod
2、Deployments管理
2.1、创建 Deployment
2.2、查看 Deployment 状态
2.3、更新 Deployment
2.4、滚动更新状态
2.5、回滚 Deployment
2.6、扩缩容 Deployment
2.7、删除 Deployment
2.8、在命名空间中管理 Deployment
3、Services管理
3.1、Service 类型简介
3.2、创建 Service
3.3、查看 Service 状态
3.4、访问 Service
3.5、更新 Service
3.6、删除 Service
4、ConfigMaps管理
4.1、创建 ConfigMap
4.2、查看 ConfigMap
4.3、在 Pod 中使用 ConfigMap
5、Secrets 管理
5.1、创建 Secret
5.2、查看 Secret
5.3、在 Pod 中使用 Secret
一、引言
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集群安装过程中的关键步骤》
《在Centos中搭建 K8s 1.23 集群超详细讲解》
二、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-podnamespace: default
spec:containers:- name: nginx-containerimage: nginx:latestports:- 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-deploylabels:app: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginx-containerimage: nginx:latestports:- 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: nginxports:- protocol: TCPport: 80targetPort: 80type: 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-containerimage: nginxenv:- name: USERNAMEvalueFrom:configMapKeyRef:name: db-configkey: username
方式二:作为挂载的文件
apiVersion: v1
kind: Pod
metadata:name: configmap-volume-example
spec:containers:- name: my-containerimage: nginxvolumeMounts:- name: config-volumemountPath: "/etc/config"volumes:- name: config-volumeconfigMap: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-containerimage: nginxenv:- name: DB_USERNAMEvalueFrom:secretKeyRef:name: db-secretkey: username
方式二:作为挂载的文件
apiVersion: v1
kind: Pod
metadata:name: secret-volume-example
spec:containers:- name: my-containerimage: nginxvolumeMounts:- name: secret-volumemountPath: "/etc/secret"readOnly: truevolumes:- name: secret-volumesecret:secretName: db-secret
💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Kubernetes的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺
🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!