工作变动总结一下之前的笔记,整理一个速查的东西,方便之后查阅
Kubernetes (k8s) 的 API 版本表示资源定义在 API 服务器中的稳定性和支持程度。API 版本由一个字符串表示,如 v1
或 apps/v1
,其中包括两个部分:
apps
表示应用程序相关的资源如 Deployments。v1
、v1beta1
等。networking.k8s.io/v1
)。开发人员在使用 Kubernetes 时,通常会涉及到这些资源的创建和管理。通过这些资源,他们可以定义和配置应用的运行环境,实现自动化和弹性伸缩等特性。理解这些资源的作用和使用方式,是开发人员在 Kubernetes 平台上高效工作的基础。
apiVersion: >
kind: >
metadata:
name: >
namespace: >
labels:
: >
annotations:
: >
spec:
...
status:
...
spec
字段的内容高度依赖于资源的 kind
类型。以下是一些常见资源类型的 spec
字段示例:
Pod:
spec:
containers:
- name: -name>
image: -image>
ports:
- containerPort: -number>
Service:
spec:
selector:
:
Deployment:
spec:
replicas: -of-replicas>
selector:
matchLabels:
:
ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: >
namespace: >
labels:
: >
annotations:
: >
data: # ConfigMap\Secret 特有的
: >
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: >
namespace: >
labels:
: >
annotations:
: >
spec:
ingressClassName: >
defaultBackend:
service:
name: >
port:
number: >
resource:
apiGroup: >
kind: >
name: >
tls:
- hosts:
- >
secretName: >
rules:
- host: >
http:
paths:
- path: >
pathType: >
backend:
service:
name: >
port:
name: >
number: >
resource:
apiGroup: >
kind: >
name: >
status:
loadBalancer:
ingress:
- ip: >
hostname: >
StatefulSet
和 Deployment
是 Kubernetes 中两种不同类型的资源控制器,它们用于管理 Pod 的生命周期,但它们主要用于不同的场景,并提供不同的功能。
Deployment
适用于无状态的应用。这意味着单个 Pod 的实例是可以互换的,它们不需要保持任何持久状态。Deployment
创建的所有 Pod 副本都是相同的。Deployment
支持滚动更新,可以在不停止服务的情况下更新应用。Deployment
确保指定数量的 Pod 副本始终处于运行状态。StatefulSet
适用于需要持久存储和特定网络标识的有状态应用。StatefulSet
保证 Pod 是按顺序创建和删除的。StatefulSet
确保操作是按照顺序进行的。Deployment
更适合。StatefulSet
更适合。总的来说,选择 StatefulSet
或 Deployment
取决于你的应用是否需要保持状态以及你对网络标识和存储的需求。
下面是一个使用Kubernetes部署Apollo的例子,包括一个Pod、一个Service和一个Deployment。
apiVersion: apps/v1
kind: Deployment
metadata:
name: apollo
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: apollo
template:
metadata:
labels:
app: apollo
spec:
containers:
- name: apollo
image: apolloconfig/apollo-portal:latest
env:
- name: SPRING_DATASOURCE_URL
value: jdbc:mysql://your-mysql-server:3306/ApolloConfigDB?characterEncoding=utf8
- name: SPRING_DATASOURCE_USERNAME
value: yourusername
- name: SPRING_DATASOURCE_PASSWORD
value: yourpassword
ports:
- containerPort: 8070
# ---
# apiVersion: v1
# kind: Service
# metadata:
apiVersion: v1
kind: Service
metadata:
name: apollo-service
namespace: default
spec:
selector:
app: apollo
ports:
- protocol: TCP
port: 80
targetPort: 8070
type: ClusterIP
apiVersion: v1
kind: Pod
metadata:
name: apollo-pod
labels:
app: apollo
spec:
containers:
- name: apollo
image: apolloconfig/apollo-portal:latest
env:
- name: SPRING_DATASOURCE_URL
value: jdbc:mysql://your-mysql-server:3306/ApolloConfigDB?characterEncoding=utf8
- name: SPRING_DATASOURCE_USERNAME
value: yourusername
- name: SPRING_DATASOURCE_PASSWORD
value: yourpassword
ports:
- containerPort: 8070
在这个例子里面, service和deployment是分开写的, 你也可以写到一块。
当你在创建 Service 时,Kubernetes 不要求对应的 Pod 或 Deployment 已经存在。Service 会持续地监听并动态地更新其选择的 Pod 列表。这意味着你可以先创建 Service,再创建 Deployment,Service 会自动发现并开始转发流量到正确的 Pod。