【openshift】在Openshift上通过yaml部署应用

在Openshift上通过yaml部署应用

1.通过直接执行yaml

通过如下命令直接执行

1
oc create -f nginx.yml

nginx.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
apiVersion: v1
items:
- apiVersion: apps.openshift.io/v1
# okd 部署配置(dc),与 k8s Deployment 资源对象类似,以启动多个容器的方式生成 pod
kind: DeploymentConfig
metadata:
# 标签,在查询时具体资源对象时非常重要,如:>oc get dc -l app=nginx
labels:
app: nginx
name: nginx
# 选定项目空间
namespace: test
spec:
# 副本数,即 nginx app 部署的实例数
replicas: 1
# pod 的计算资源配额
resources:
# pod 能分配的最大计算资源
limits:
cpu: 300m
memory: 1024Mi
# pod 分配的最少计算资源
requests:
cpu: 100m
memory: 200Mi
# 选择器 Service 根据此项来绑定到 dc
selector:
name: nginx
strategy:
# type: Recreate
type: Rolling
# dc 根据模板里内容创建 pod
template:
metadata:
labels:
app: nginx
name: nginx
deploymentconfig: nginx
spec:
# 容器集合
containers:
- capabilities: {}
# 容器内环境变量,下文给这个容器设置了时区和语言的环境变量
env:
- name: TZ
value: Asia/Shanghai
- name: LANG
value: en_US.UTF-8
# 容器使用什么镜像部署,在创建时需要替换成实际要部署的镜像
image: nginx:1.16
# 镜像下载策略,总是下载最新的(Always)
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
protocol: TCP

# 健康检查-pod 是否存活
livenessProbe:
failureThreshold: 2
# http get 请求的方式验证 pod-ip:80/
httpGet:
path: /
port: 80
initialDelaySeconds: 60
periodSeconds: 60
timeoutSeconds: 5
name: nginx
# 健康检查-pod 是否就绪
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 3
timeoutSeconds: 5
# 容器计算资源配额,与 pod 配额类似
resources:
limits:
cpu: 300m
memory: 1024Mi
requests:
cpu: 100m
memory: 200Mi
securityContext:
capabilities: {}
# privileged: true
terminationMessagePath: /dev/termination-log
# 将 pod 中配置的卷挂载到容器内
# volumeMounts:
# - mountPath: /data
# name: nginx
dnsPolicy: ClusterFirst
# 使用节点选择器将应用固定部署到 node1 计算节点上
# nodeSelector:
# kubernetes.io/hostname: node1.app.com
restartPolicy: Always
# 配置和定义使用实际计算节点主机文件夹地址这种类型的卷
# volumes:
# - persistentVolumeClaim:
# claimName: nginx
# name: nginx
# pod 触发器--配置变动触发更新
triggers:
- type: ConfigChange
- apiVersion: v1
# 服务,与 k8s 中 service 一样,将 dc 上部署的应用暴露给内部(多)或外部(少)
kind: Service
metadata:
labels:
app: nginx
name: nginx
spec:
# 应用中要暴露的端口信息
ports:
- name: http
# 对外暴露的端口
port: 80
protocol: TCP
# 应用实际端口
targetPort: 80
# 通过选择器选择 dc
selector:
name: nginx
sessionAffinity: None
type: ClusterIP

- apiVersion: route.openshift.io/v1
# OKD 平台特有资源,与 k8s 中 ingress 类似,用于将 service 正真暴露给外部使用,但只能使用域名访问
kind: Route
metadata:
labels:
app: nginx
name: nginx
spec:
# 配置域名
host: xinchen.app.com
to:
kind: Service
name: nginx
kind: List
metadata: {}

2. 通过创建template

参考文档: https://docs.okd.io/latest/dev_guide/templates.html#writing-templates

相关指令

1
2
3
4
5
6
7
8
9
10
11
12
13

# 上传模板
oc create -f <filename> -n <project>

# 使用模板
oc process -f nginx-template -p IMAGE_NAME=nginx:1.6 -p REPLICA_COUNT=1

# 编辑模板
oc edit template <templateName>

# 导出模板
oc get -o yaml --export all > <yaml_filename>

nginx-template.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
kind: Template
apiVersion: v1
metadata:
name: nginx-template
objects:
- kind: DeploymentConfig
apiVersion: v1
metadata:
name: nginx
namespace: xinchen
labels:
app: nginx
spec:
replicas: ${REPLICA_COUNT}
selector:
name: nginx

resources:
limits:
cpu: 300m
memory: 1024Mi
requests:
cpu: 100m
memory: 200Mi

strategy:
type: Rolling

template:
metadata:
labels:
app: nginx
name: nginx
deploymentconfig: nginx
spec:

containers:
- capabilities: {}

env:
- name: TZ
value: Asia/Shanghai
- name: LANG
value: en_US.UTF-8

image: ${IMAGE_NAME}

imagePullPolicy: IfNotPresent

ports:
- containerPort: 80
protocol: TCP

livenessProbe:
failureThreshold: 2
httpGet:
path: /
port: 80
initialDelaySeconds: 60
periodSeconds: 60
timeoutSeconds: 5
name: nginx

readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 3
timeoutSeconds: 5

resources:
limits:
cpu: 300m
memory: 1024Mi
requests:
cpu: 100m
memory: 200Mi

securityContext:
capabilities: {}
# privileged: true
terminationMessagePath: /dev/termination-log

# volumeMounts:
# - mountPath: /data
# name: nginx
dnsPolicy: ClusterFirst

restartPolicy: Always

# volumes:
# - persistentVolumeClaim:
# claimName: nginx
# name: nginx
# pod 触发器--配置变动触发更新
triggers:
- type: ConfigChange

- kind: Service
apiVersion: v1
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- name: 80-tcp
port : 80
protocol: TCP
targetPort: 80
selector:
name: nginx
sessionAffinity: None
type: ClusterIP

- apiVersion: route.openshift.io/v1
kind: Route
metadata:
labels:
app: nginx
name: nginx
spec:
host: ${HOST_NAME}
port:
targetPort: 80-tcp
to:
kind: Service
name: nginx
weight: 100

parameters:
- name: HOST_NAME
displayName: Host Name
required: true
- name: IMAGE_NAME
displayName: Image Name
required: true
- name: REPLICA_COUNT
displayName: Replica Count
value: "1"
required: true

3. 进入运行的容器

参考: https://docs.okd.io/latest/dev_guide/ssh_environment.html

1
2
3
4
5
6
7
8
9

# 查看pod名
oc get pods

# 进入容器
oc rsh <pod>

# 或者直接进入dc
oc rsh dc/nginx

4. 删除所有

1
2
# 删除所有
oc delete all -l app=nginx