目录
- Kubernetes 简介
- Kubernetes 安装
- Kubernetes 基本概念
- Pod
- Service
- Deployment
- Kubernetes 使用案例
- 部署一个 Web 应用
Kubernetes 简介
Kubernetes 是一个开源的容器编排工具,用于自动化部署、扩展和管理容器化应用程序。它最初是由 Google 开发,并于 2014 年开源,现在由 Cloud Native Computing Foundation(CNCF)维护。
Kubernetes 提供了一种便捷的方式来管理多个容器,可以自动处理容器的部署、升级、容错、伸缩等任务。同时,它还提供了一组强大的 API,可以让用户更加灵活地管理容器。
Kubernetes 安装
Kubernetes 支持在多种操作系统上安装和运行,例如 Linux、macOS 和 Windows。在本教程中,我们以 Ubuntu 18.04 为例,介绍如何在 Ubuntu 18.04 上安装 Kubernetes。
1. 安装 Docker
Kubernetes 使用 Docker 作为容器运行时,因此需要先安装 Docker。
bashCopy code
$ sudo apt-get update $ sudo apt-get install -y docker.io
2. 安装 Kubernetes
Kubernetes 的组件包括 kubelet、kubeadm、kubectl 等。可以通过以下命令来安装这些组件:
bashCopy code
$ sudo apt-get update && sudo apt-get install -y apt-transport-https curl $ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - $ echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list $ sudo apt-get update $ sudo apt-get install -y kubelet kubeadm kubectl
3. 初始化 Kubernetes 集群
在安装完 Kubernetes 后,需要通过 kubeadm 工具来初始化 Kubernetes 集群。
bashCopy code
$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16
其中,--pod-network-cidr
参数指定了 Pod 网络的地址段,这里使用了 Calico 的默认地址段。
初始化成功后,可以通过以下命令来启用 kubelet:
bashCopy code
$ sudo systemctl enable kubelet.service
4. 安装 Pod 网络插件
Kubernetes 中的 Pod 需要在一个虚拟网络中进行通信,因此需要安装 Pod 网络插件。
这里我们选择使用 Calico 插件:
bashCopy code
$ kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/calico.yaml
5. 加入集群
最后,需要将其他节点加入 Kubernetes 集群。可以通过以下命令来获取加入集群的命令:
bashCopy code
$ sudo k
在Kubernetes中,Secret是用于存储敏感数据的对象,例如密码、API密钥和证书等。与ConfigMap一样,Secret也以键值对的形式存储数据,但它的值被Base64编码,以确保安全性。
可以使用以下命令创建一个名为my-secret的Secret对象:
csharpCopy code
kubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=secret
此命令将创建一个名为my-secret的通用Secret对象,其中包含两个键值对:username=admin和password=secret。
在Pod中使用Secret时,可以通过环境变量或Volume将其注入到容器中。以下是使用环境变量注入Secret的示例:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
env:
- name: USERNAME
valueFrom:
secretKeyRef:
name: my-secret
key: username
- name: PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: password
在此示例中,我们将用户名和密码注入到名为my-container的容器中,并将它们存储在名为USERNAME和PASSWORD的环境变量中。Secret是使用SecretKeyRef对象引用的,该对象定义了要从中提取值的Secret的名称和密钥。
以下是使用Volume将Secret挂载到容器中的示例
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
volumeMounts:
- name: my-secret-volume
mountPath: /etc/secrets
env:
- name: USERNAME
valueFrom:
secretKeyRef:
name: my-secret
key: username
- name: PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: password
volumes:
- name: my-secret-volume
secret:
secretName: my-secret
在此示例中,我们将名为my-secret的Secret作为Volume挂载到容器的/etc/secrets目录中。Secret是通过其名称引用的,并且在Pod中使用volumes字段定义。
Service
Kubernetes 中的 Service 用于定义一组 Pod 的访问方式。Service 可以将一组 Pod 隐藏起来,使得客户端可以通过 Service 的唯一 IP 地址来访问这些 Pod,而无需知道实际 Pod 的 IP 地址。
Service 的类型
Kubernetes 中的 Service 有四种类型:ClusterIP、NodePort、LoadBalancer 和 ExternalName。
ClusterIP
ClusterIP 是 Service 的默认类型,它将创建一个仅在 Kubernetes 集群内部可访问的虚拟 IP 地址。当访问这个虚拟 IP 地址时,Kubernetes 会将请求负载均衡到 Service 对应的 Pod 上。这种类型的 Service 适用于内部服务之间的通信。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ClusterIP
selector:
app: my-app
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
NodePort
NodePort 类型会在每个 Node 上绑定一个固定的端口,这样可以通过 Node 的 IP 地址和 NodePort 来访问 Service。这种类型的 Service 适用于需要从外部访问 Service 的场景
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort
selector:
app: my-app
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
nodePort: 30080
LoadBalancer
LoadBalancer 类型会在云平台上创建一个负载均衡器,并将流量转发到 Service 中的 Pod。这种类型的 Service 适用于需要从外部访问 Service 的场景
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: LoadBalancer
selector:
app: my-app
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
ExternalName
ExternalName 类型可以将 Service 映射到集群外部的服务地址。这种类型的 Service 适用于需要访问集群外部服务的场景
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ExternalName
externalName: my-database.example.com
ports:
- name: mysql
protocol: TCP
port: 3306
Service 的选择器
Service 通过 label selector 与 Pod 建立联系。它使用 label selector 来匹配具有相同标签的 Pod,并将请求转发到这些 Pod 上。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ClusterIP
selector:
app: my-app
ports:
- name: http
protocol: TCP
port: 80
targetPort