Openshift 上运行nginx
Openshift运行平台
OpenShift playground:
https://developers.redhat.com/courses/explore-openshift/openshift-playground
Openshift运行nginx(1)
// 1. 运行nginx
oc run nginx --image=nginx --labels="app=nginx"
// 2. 获取pod yaml信息(理解里边每一行参数意义)-o 即output
oc get pods nginx -o yaml
// 3. 进入nginx 容器 & ping nginx,即可访问到页面;
oc rsh nginx
curl http://localhost
// 4. 创建service
oc create service clusterip nginx --tcp=8080:80
oc get svc
// 5. 创建route,路由可以通过一个公开可访问的URL访问你的应用程序。
oc expose service nginx
oc get route
// 6. 打开浏览器, 输入网址:http://nginx-default.crc-lgph7-master-0.crc.fc4pxfk1oge7.instruqt.io/, 你将看到 nginx 的页面。
理解
- 在openshift上运行nginx与在单机平台docker上其实一样,只是在运行之前,需要master指定当前有几个node,以及image会在哪个node上运行。这是master上的 Scheduler 第一步需要做的。然后利用node的接口crictl去下载image,再run image。
- Pod是Kubernetes中可以创建和部署的最小单位。 Pod为一个或多个 container 的组合,K8S为了便于管理 container,将他们封装为 pod。
- Service 是内部的负载均衡器。 Service 是一种抽象的方式,将一组 Pod 上运行的应用程序公开为网络服务。使用 Kubernetes,您无需修改应用程序即可使用不熟悉的服务发现机制。Kubernetes 为 Pod 提供了自己的 IP 地址和一组 Pod 的单个 DNS 名称,并且可以在它们之间进行负载平衡。
Service 与Pod的绑定是通过lable,两者有相同的lable ,就可以通过lable找到对应的pod,具体可以在pod yaml 里体现;
4.要想获取openshift-ingress 的log,需要去openshift-ingress-operator项目下开启log模式,再次刷新页面,就会有访问log生成;https://docs.openshift.com/container-platform/4.10/networking/ingress-operator.html#nw-configure-ingress-access-logging_configuring-ingress
logging:
access:
destination:
type: Container
查看log命令:
oc logs xxx -c logs //xxx 是pod 名字,后边的logs是container名字
- 访问顺序:user --> load balance --> ingress --> service --> pod;
Openshift运行nginx(2)
-
切换到Developer下,新建项目nginx;
-
点击 Container images;
-
Deployment 在k8s和openshift 平台都有,DeploymentConfig k8s 平台上没有,所以选Deployment ,在k8s 上也可以兼容;
-
这种方式下,open shift会默认给我们创建service和route;
点击create;
会发现与运行异常;
-
看log会发现pod没运行起来,原因是nginx 容器需要用root权限去运行,然而openshift为了安全,默认情况下不会让用户以root去运行,而非root用户没有权限开启nginx的80端口,导致报错;
-
为什么 OpenShift 集群运行 ngxin (1) 成功, 然而 OpenShift 集群运行 ngxin(2) 失败
根本原因就是上述两种方式运行 nginx pod 的 Security Context Constraints (scc) 不一样,第一种方式的 scc 策略是 openshift.io/scc: anyuid, 而第二种方式的 scc 策略是 openshift.io/scc: restricted 。
如何解决OpenShift 集群运行 ngxin(2)的错误:
重新构建一个 non-root 用户可以运行的 nginx 镜像。
给 service account default 用户添加 anyuid 的 scc。其命令是 oc adm policy add-scc-to-user anyuid -z default
并且这种有controller方式运行的nginx 在delete pod后可以自动重新启动pod;
-
运行成功;