Kubernetes是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。它使用Pod作为基本的运行单元,每个Pod可以包含一个或多个紧密相关的容器。Kubernetes从入门到精通的学习将带你走进Kubernetes的世界,探索其强大的功能,提升你在云原生环境下的应用开发和运维能力 。
本文目录导读:
Kubernetes是一个开源的容器编排系统,用于自动化应用程序容器的部署、扩展和管理,它最初是由Google设计并开发的,后来成为云原生计算基金会(CNCF)的一部分,Kubernetes在全球范围内得到了广泛的应用和认可,越来越多的企业和开发者开始使用Kubernetes来构建和管理他们的应用程序,本文将从Kubernetes的基本概念和组件入手,详细介绍如何搭建一个Kubernetes集群,以及如何进行集群管理和维护。
Kubernetes基本概念和组件
1、Kubernetes核心概念
- Pod:最小的部署单元,包含一个或多个紧密关联的容器。
- Service:定义了一组Pod的访问策略,可以是负载均衡、会话保持等。
- Deployment:描述了期望的应用程序状态,包括副本数、更新策略等。
- ReplicaSet:确保指定数量的Pod副本始终处于运行状态。
- StatefulSet:用于管理有状态应用程序的副本集,保证每个副本具有唯一的网络标识符和存储卷。
- ConfigMap:用于存储非敏感配置信息,如数据库连接字符串等。
- Secret:用于存储敏感配置信息,如密码、密钥等。
2、Kubernetes主要组件
- API Server:Kubernetes的核心组件,负责处理所有的API请求。
- etcd:分布式键值存储系统,用于保存Kubernetes的配置数据和状态信息。
- kubelet:运行在每个节点上的代理,负责与API Server通信并执行Pod的创建、删除等操作。
- kubectl:命令行工具,用于与API Server交互,实现对Kubernetes资源的管理。
搭建Kubernetes集群
1、环境准备
- 确保所有节点已安装Docker和kubelet。
- 为所有节点配置SSH免密登录。
- 在所有节点上安装etcd。
2、初始化etcd集群
```bash
ETCDCTL_API=3 etcdctl --endpoints=https://<node1>:2379,https://<node2>:2379,https://<node3>:2379 --cacert=/path/to/ca.crt \n --cert=/path/to/client.crt --key=/path/to/client.key init \n --name=default --initial-advertise-peer-urls=https://<node1>:2380 \n --listen-peer-urls=https://<node1>:2380 --advertise-client-urls=https://<node1>:2379 \n --initial-cluster=default=https://<node1>:2380,<node2>:2380,<node3>:2380 \n --initial-cluster-token=my-cluster-token --initial-cluster-state=new \n --data-dir=/var/lib/etcd/default.etcd
```
3、加入节点到集群
```bash
etcdctl --endpoints=https://<node1>:2379,https://<node2>:2379,https://<node3>:2379 \n --cacert=/path/to/ca.crt --cert=/path/to/client.crt --key=/path/to/client.key \n member add <node4> https://<node4>:2380 --peer-urls=https://<node4>:2380 \n --initial-advertise-peer-urls=https://<node4>:2380 \n --listen-peer-urls=https://<node4>:2380 --advertise-client-urls=https://<node4>:2379 \n --name=default --initial-cluster=default=https://<node1>:2380,<node2>:2380,<node3>:2380,<node4>:2380 \n --initial-cluster-token=my-cluster-token --initial-cluster-state=existing
```
Kubernetes集群管理
1、Pod管理
通过kubectl create命令创建Pod,通过kubectl delete命令删除Pod。
```bash
kubectl create pod myapp --image=nginx --port=80
kubectl delete pod myapp
```
2、Service管理
通过kubectl expose命令创建Service,通过kubectl delete命令删除Service。
```bash
kubectl expose deployment myapp --type=LoadBalancer --port=80 --target-port=80
kubectl delete service myapp
```
3、ReplicaSet管理
通过kubectl create命令创建ReplicaSet,通过kubectl delete命令删除ReplicaSet。
```bash
kubectl create replicaset myapp --image=nginx --replicas=3 --port=80
kubectl delete replicaset myapp
```
4、StatefulSet管理
与ReplicaSet类似,但StatefulSet还支持有序部署、滚动升级等功能。
```yaml
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: myapp
spec:
serviceName: "myapp" # 必须与deployment名称相同(默认为“default”)
replicas: +1 # 必须大于0且为整数类型(默认为1)
selector: matchLabels: app="myapp" # 必须与deployment标签匹配(默认为“app” = “myapp”)
template: # Pod模板定义(默认为Deployment模板)
metadata: labels: app="myapp" # 必须与selector匹配(默认为“app” = “myapp”) # 注意此处不能使用“app” = “myapp”,因为这将覆盖selector中的设置!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # 如果需要使用label选择器,请使用以下语法(注意此处不能使用“app” = “myapp”,因为这将覆盖selector中的设置): # metadata.labels = {"app": "myapp"} # 或者直接省略metadata部分 containers: # Pod中容器定义(默认为Deployment模板) name: "myapp" image: "nginx" ports: # Pod端口映射定义(默认为Deployment模板) containerPort: "80" volumeMounts: # Pod挂载卷定义(默认为Deployment模板) name: "config" mountPath: "/etc/nginx" envFromSources: # Pod环境变量来源定义(默认为Deployment模板) configMapKeyRef: name: "configmap" keyRefName: "config" volumesToAttachOrCreate: # Pod挂载卷定义(默认为Deployment模板) name: "config" configMapRef: # 注意此处不能使用“configmap” = “myconfig”,因为这将覆盖volumeMounts中的设置 itemLabelSelector: key="key" value="value" persistentVolumeClaimTemplates: # Pod持久卷声明模板定义(默认为Deployment模板) metadata: { "storageClassName": "standard" } spec: accessModes: ["ReadWriteOnce"] resources: requests={ "storage": "1Gi" } storageClassNameRef: name="standard" volumeClaimTemplatesToUse: # Pod持久卷声明模板使用情况定义(默认为Deployment模板) useIfPresentOrCreate: true # 如果已经存在同名PVC则使用它;否则创建一个新的PVC withDefaultClassAndParametersIfNeeded # 如果不存在同名PVC且没有默认类和参数,则创建一个新的PVC withDefaultClassAndParametersIfNeeded # 如果不存在同名PVC且没有默认类和参数,则创建一个新的PVC withDefaultClassAndParametersIfNeeded # 如果不存在同名PVC且没有默认类和参数,则创建一个新的PVC withDefaultClassAndParametersIfNeeded # 如果不存在同名PVC且没有默认类和参数,则创建一个新的PVC withDefaultClassAndParametersIfNeeded # 如果不存在同名PVC且没有默认类和参数,则创建一个新的PVC withDefaultClassAndParametersIfNeeded # 如果不存在同名PVC且没有默认类和参数,则创建一个新的PVC withDefaultClassAndParametersIfNeeded # 如果不存在同名PVC且没有默认类和参数,则创建一个新的PVC withDefaultClassAndParametersIfNeeded # 如果不存在同名PVC且没有