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

$ export KUBECONFIG=INSTALL_DIR/auth/kubeconfig
$ oc login -u kubeadmin -p MMTUc-TnXjo-NFyh3-aeWmC

查看集群版本相关信息

$ oc get clusterversion
$ oc describe clusterversion

查看节点信息

$ oc get nodes

查看实际资源使用情况

$ oc adm top nodes

查看更详细的节点信息

oc describe node my-node-name

查看 Operator 状态

$ oc get clusteroperators

查看节点日志

$ 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

排查节点系统层面的信息(在节点上开一个shell)

$ oc debug node/my-node-name
sh-4.2# chroot /host
sh-4.2# systemctl is-active kubelet

排查 Container Engine

$ oc debug node/my-node-name
sh-4.2# chroot /host
sh-4.2# crictl ps

查看 Pod 的部署状态/报错

$ oc get pod
$ oc status
$ oc describe pod
$ oc describe

查看 container 的日志

$ oc logs my-pod-name
$ oc logs my-pod-name -c my-container-name (如果有多个container,指定其中一个)

创建一个 Troubleshooting Pod.
oc debug 可以根据现有 pod/deployment 等环境,创建一个类似的 pod 用于排查。这个 pod 会提供一个 shell.

$ oc debug deployment/my-deployment-name --as-root

进入运行中的 Pod 进行排查 remote shell

$ 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

排查 OC 命令本身

$ oc get pod --loglevel 6
$ oc whoami -t

认证配置

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

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

配置 HTPasswd 的示例步骤如下。

$ 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

控制资源访问

Add/remove role

$ oc adm policy add-cluster-role-to-user cluster-role username
$ oc adm policy remove-cluster-role-from-user cluster-role username

who-can 命令可以看谁有权限做某个操作

$ oc adm policy who-can delete user

例如,在 wordpress 这个 project 中,将 dev 用户加红色那个 basic-user 权限.

$ oc adm policy add-role-to-user basic-user dev -n wordpress

另外,对于应用的密钥等数据,可以用 secret 来存放和传递。示例:

$ 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

网络配置

让公网能够访问到服务的最简单方法,是使用 expose 命令。

$ oc expose service frontend \
>    --hostname todo.${RHT_OCP4_WILDCARD_DOMAIN}

$ oc get routes

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 等。

$ oc label node node1.us-west-1.compute.internal env=dev
$ oc get node node2.us-west-1.compute.internal --show-labels

同样,可以对 machineset 设置 label. 在云环境中,通常一个可用区会有一个 machineset.

$ 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:

在 deployment 的配置中,也可以指定 pod 被调度在什么节点上。

$ oc patch deployment/myapp --patch \
>    '{"spec":{"template":{"spec":{"nodeSelector":{"env":"dev"}}}}}'

可以设置 pod 的 replica 的数量

$ oc scale --replicas 3 deployment/myapp

伸缩集群

$ oc scale --replicas=2 \
>    machineset MACHINE-SET -n openshift-machine-api