Openshift 4 学习笔记

DO280 在线课程的笔记。

Openshift 是基于 k8s 的 paas 产品,基本概念与 k8s 差不多。 Openshift 使用 Project 划分不同的 namespace, 隔离不同的资源。

Operator

Openshift 4 引入了 Operator 的概念。Operator 可以帮助管理资源。
Operators usually define custom resources (CR) that store their settings and configurations. An OpenShift administrator manages an operator my editing its custom resources. The syntax of a custom resource is defined by a custom resource definition (CRD).

Operator 通过调用 kubernetes 的 api 来实现它的功能。不过直接调用底层 api 会比较麻烦,因此有一个 Operator Software Development Kit (Operator SDK) 来帮助开发 Operator.

Operator Life Cycle Manager (OLM) 负责管理 Operator 的生命周期,它本身也是一个 Operator.

安装 Openshift

Openshift 的安装方法分两种。 Full-Stack Automation 和 Pre-existing Infrastructure.

Full-Stack Automation 通常用于公有云环境。用户提供公有云的信息,例如AKSK. 安装程序会自动创建全套环境。
Pre-existing Infrastructure 适用与 bare-mental 或者 vmware 等环境,需要自行配置信息。

常用排查命令

登陆 OC
[cc lang=”text”]
$ export KUBECONFIG=INSTALL_DIR/auth/kubeconfig
$ oc login -u kubeadmin -p MMTUc-TnXjo-NFyh3-aeWmC
[/cc]

查看集群版本相关信息
[cc lang=”text”]
$ oc get clusterversion
$ oc describe clusterversion
[/cc]

查看节点信息
[cc lang=”text”]
$ oc get nodes
[/cc]

查看实际资源使用情况
[cc lang=”text”]
$ oc adm top nodes
[/cc]

查看更详细的节点信息
[cc lang=”text”]
oc describe node my-node-name
[/cc]

查看 Operator 状态
[cc lang=”text”]
$ oc get clusteroperators
[/cc]

查看节点日志
[cc lang=”text”]
$ oc adm node-logs -u crio my-node-name
$ oc adm node-logs -u kubelet my-node-name
$ oc adm node-logs my-node-name
[/cc]

排查节点系统层面的信息(在节点上开一个shell)
[cc lang=”text”]
$ oc debug node/my-node-name
sh-4.2# chroot /host
sh-4.2# systemctl is-active kubelet
[/cc]

排查 Container Engine
[cc lang=”text”]
$ oc debug node/my-node-name
sh-4.2# chroot /host
sh-4.2# crictl ps
[/cc]

查看 Pod 的部署状态/报错
[cc lang=”text”]
$ oc get pod
$ oc status
$ oc describe pod
$ oc describe
[/cc]

查看 container 的日志
[cc lang=”text”]
$ oc logs my-pod-name
$ oc logs my-pod-name -c my-container-name (如果有多个container,指定其中一个)
[/cc]

创建一个 Troubleshooting Pod.
oc debug 可以根据现有 pod/deployment 等环境,创建一个类似的 pod 用于排查。这个 pod 会提供一个 shell.
[cc lang=”text”]
$ oc debug deployment/my-deployment-name –as-root
[/cc]

进入运行中的 Pod 进行排查 remote shell
[cc lang=”text”]
$ oc rsh my-pod-name
$ oc cp /local/path my-pod-name:/container/path (从本地复制东西到 container)
$ oc port-forward my-pod-name local-port:remote-port
[/cc]

排查 OC 命令本身
[cc lang=”text”]
$ oc get pod –loglevel 6
$ oc whoami -t
[/cc]

认证配置

Openshift 支持多种 Identity Providers:
HTPasswd
Keystone
LDAP
GitHub or GitHub Enterprise
OpenID Connect

在 Openshift 安装完成后,会自动创建一个 kubeadmin 的超级用户。

配置 HTPasswd 的示例步骤如下。
[cc lang=”text”]
$ htpasswd -c -B -b ~/DO280/labs/auth-provider/temp admin ${PASSWD}
$ htpasswd -b ~/DO280/labs/auth-provider/temp developer ${PASSWD}

$ oc login -u kubeadmin -p ${PASSWD} ${OCP4_MASTER_API}
$ oc create secret generic localusers –from-file htpasswd=/home/student/DO280/labs/auth-provider/temp -n openshift-config
$ oc adm policy add-cluster-role-to-user cluster-admin admin
$ oc get -o yaml oauth cluster > ~/DO280/labs/auth-provider/oauth.yaml

## add below config to the yaml.
apiVersion: config.openshift.io/v1
kind: OAuth
…output omitted…
spec:
identityProviders:
– htpasswd:
fileData:
name: localusers
mappingMethod: claim
name: myusers
type: HTPasswd

$ oc replace -f ~/DO280/labs/auth-provider/oauth.yaml

$ oc login -u admin -p ${RHT_OCP4_USER_PASSWD}

$ oc get identity
[/cc]

控制资源访问

Add/remove role
[cc lang=”text”]
$ oc adm policy add-cluster-role-to-user cluster-role username
$ oc adm policy remove-cluster-role-from-user cluster-role username
[/cc]

who-can 命令可以看谁有权限做某个操作
[cc lang=”text”]
$ oc adm policy who-can delete user
[/cc]

例如,在 wordpress 这个 project 中,将 dev 用户加红色那个 basic-user 权限.
[cc lang=”text”]
$ oc adm policy add-role-to-user basic-user dev -n wordpress
[/cc]

另外,对于应用的密钥等数据,可以用 secret 来存放和传递。示例:
[cc lang=”text”]
$ oc new-project authorization-secrets
$ oc create secret generic mysql \
> –from-literal user=myuser –from-literal password=redhat123 \
> –from-literal database=test_secrets –from-literal hostname=mysql

$ oc new-app –name mysql \
> –docker-image registry.access.redhat.com/rhscl/mysql-57-rhel7:5.7-47

$ oc get pods -w
mysql-1-xxxx 0/1 Error

$ oc set env dc/mysql –prefix MYSQL_ \
> –from secret/mysql

$ oc get pods
mysql-2-rqp77 1/1 Running 0 24s

[/cc]

网络配置

让公网能够访问到服务的最简单方法,是使用 expose 命令。
[cc lang=”text”]
$ oc expose service frontend \
> –hostname todo.${RHT_OCP4_WILDCARD_DOMAIN}

$ oc get routes
[/cc]

openshift 里提供多种供外部访问的方式
Ingress (resource)
External load balancer (service type)
Service external IP (service type)
NodePort (service type)

Pod 调度

OpenShift Scheduler Algorithm 会决定 Pod 调度在哪个节点上。它分3步来选节点:
1. Filtering nodes.
首先会根据节点的资源情况,以及 Taint 的情况,过滤出可以使用的节点。

2. Prioritizing the filtered list of nodes.
然后,会根据 affinity 和 anti-affinity 规则,计算出各个节点的分数。

3. Selecting the best fit node.
选出分数最高的节点来使用。如果多个节点分数相同,则用 round-robin 的方式选择。

节点也可以打 Label, 根据 label 来选择使用什么节点。比如,可以将节点分为 prod, dev 等。
[cc lang=”text”]
$ oc label node node1.us-west-1.compute.internal env=dev
$ oc get node node2.us-west-1.compute.internal –show-labels
[/cc]

同样,可以对 machineset 设置 label. 在云环境中,通常一个可用区会有一个 machineset.
[cc lang=”text”]
$ oc get machineset -n openshift-machine-api
$ oc edit machineset ocp-qz7hf-worker-us-west-1b \
> -n openshift-machine-api

spec:
metadata:
creationTimestamp: null
labels:
env: dev //<----- providerSpec: [/cc] 在 deployment 的配置中,也可以指定 pod 被调度在什么节点上。 [cc lang="text"] $ oc patch deployment/myapp --patch \ > ‘{“spec”:{“template”:{“spec”:{“nodeSelector”:{“env”:”dev”}}}}}’
[/cc]

可以设置 pod 的 replica 的数量
[cc lang=”text”]
$ oc scale –replicas 3 deployment/myapp
[/cc]

伸缩集群

[cc lang=”text”]
$ oc scale –replicas=2 \
> machineset MACHINE-SET -n openshift-machine-api
[/cc]