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]