wiki:linux/openshift

OpenShift?

デバッグノウハウ

診断

# oc adm diagnostics

サービスの状態確認

# oc status -v 

Podの状態、ログ確認

# oc get pods
# oc logs <Pod名>

コンテナの状態、ログ確認

# docker ps --alll
# docker log <コンテナ名>

ユーザの作成と権限付与

# oc create user myuser
# htpasswd /etc/openshift/openshift-passwd myuser
# oc policy add-role-to-user edit myuser -n myproject

パスワードの設定は、htpasswdなり認証の仕組みを利用して行う必要があることに注意。

ボリュームの利用(NFS)

Persistence Volumeをシステムで作成し、Persistence Volume Claimをプロジェクトで利用するボリューム領域として作成します。

py.yml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv0001
spec:
  capacity:
    storage: 2Gi
  accessModes:
  - ReadWriteOnce
  nfs:
    path: /var/lib/docker/nfs
    server: 10.0.0.7
  persistentVolumeReclaimPolicy: Recycle
# oc login -u system:admin
...
# oc create -f pv.yml

pvc.yml

apiVersion: "v1"
kind: "PersistentVolumeClaim"
metadata:
  name: "claim1"
spec:
  accessModes:
    - "ReadWriteOnce"
  resources:
    requests:
      storage: "1Gi"
  volumeName: "pv0001"
# oc login -u system:admin
...
# oc create -f pv.yml

イメージのプッシュ(内部レジストリ)

■内部レジストリのURL確認
[root@os-master1 ~]# oc login -u system:admin
Logged into "https://os-master1.local:8443" as "system:admin" using existing credentials.

You have access to the following projects and can switch between them with 'oc project <projectname>':

  * common
    default
    kube-public
    kube-service-catalog
    kube-system
    logging
    management-infra
    openshift
    openshift-infra
    openshift-node

Using project "common".
[root@os-master1 ~]# oc get svc -n  default
NAME               CLUSTER-IP       EXTERNAL-IP   PORT(S)                   AGE
docker-registry    172.30.207.150   <none>        5000/TCP                  3d
kubernetes         172.30.0.1       <none>        443/TCP,53/UDP,53/TCP     3d
registry-console   172.30.108.12    <none>        9000/TCP                  3d
router             172.30.164.49    <none>        80/TCP,443/TCP,1936/TCP   3d

■イメージのタグを作成
# docker tag docker.io/nginx:latest 172.30.207.150:5000/common/nginx:latest

■一般ユーザ(not system:admin)権限でログインしなおす
# oc login 
Authentication required for https://os-master1.local:8443 (openshift)
Username: admin
Password:
Login successful.

You have one project on this server: "common"

Using project "common".

■レジストリにログイン
# docker login -u $(oc whoami) -p $(oc whoami -t) 172.30.207.150:5000
Login Succeeded
■プッシュ
# docker push  172.30.207.150:5000/common/nginx:latest

イメージのプッシュ(外部レジストリ)

OpenShiftにログイン
[root@os-master1 ~]# oc login
Authentication required for https://os-master1.local:8443 (openshift)
Username: admin
Password:
Login successful.

You don't have any projects. You can try to create a new project, by running

    oc new-project <projectname>

イメージをアップロードするプロジェクトを作成
[root@os-master1 ~]# oc new-project common
Now using project "common" on server "https://os-master1.local:8443".

You can add applications to this project with the 'new-app' command. For example, try:

    oc new-app centos/ruby-22-centos7~https://github.com/openshift/ruby-ex.git

レジストリにログイン
[root@os-master1 ~]# docker login -u $(oc whoami) -p $(oc whoami -t) docker-registry-default.router.default.svc.cluster.local
Login Succeeded

イメージのプッシュ
[root@os-master1 ~]# docker push docker-registry-default.router.default.svc.cluster.local/common/nginx:latest
The push refers to a repository [docker-registry-default.router.default.svc.cluster.local/common/nginx]
a103d141fc98: Pushed
73e2bd445514: Pushed
2ec5c0a4cb57: Pushed
latest: digest: sha256:926b086e1234b6ae9a11589c4cece66b267890d24d1da388c96dd8795b2ffcfb size: 948

OpenShift? Originのインストール

# yum install -y epel-release 
(必要であれば)

# yum install -y docker

(OpenShift 3.5相当のOpenShift Originを使う場合)
# curl -k --location -O  https://github.com/openshift/origin/releases/download/v1.5.1/openshift-origin-server-v1.5.1-7b451fc-linux-64bit.tar.gz

(OpenShift 3.6rc0相当のOpenShiftを利用する場合)
# curl -k --location -O  https://github.com/openshift/origin/releases/download/v3.6.0-rc.0/openshift-origin-server-v3.6.0-rc.0-98b3d56-linux-64bit.tar.gz

# tar zxvf openshift-origin-server-*.tar.gz
# sudo mv openshift-* /opt/openshift

# firewall-cmd --permanent --add-port=8443/tcp
(firewalldが動作していれば)

# setenforce 0
# systemctl enable docker

# systemctl stop dnsmasq
# systemctl disable dnsmasq
(dnsmasqが動いていれば)


■下記のファイルの該当箇所を編集

○/etc/sysconfig/docker-storage
STORAGE_DRIVER='-s overlay2'

○/etc/sysconfig/docker
#OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
OPTIONS='--log-driver=journald --signature-verification=false'

○/etc/sysconfig/docker-network
DOCKER_NETWORK_OPTIONS='-dns 8.8.8.8'

○/etc/selinux/config
#SELINUXTYPE=enforcing
SELINUXTYPE=permissiv

■Docker / OpenShift実行
# systemctl restart docker
# cd /opt/openshift
# /opt/openshift/openshift start >& /var/log/openshift-console.log &

設定ファイルのパーミッション修正
# chmod +r "/opt/openshift/openshift.local.config/master/admin.kubeconfig"

■OpenShiftの利用
下記の環境変数を設定
export KUBECONFIG=/opt/openshift/openshift.local.config/master/admin.kubeconfig
export CURL_CA_BUNDLE=/opt/openshift/openshift.local.config/master/ca.crt
export PATH=/opt/openshift:${PATH}

$ oc login

※ ユーザadmin/パスワードadminでログインできれば成功

Wildcard DNSの設定

/etc/dnsmasq.conf(もしくはdnsmasq.d/xxx.conf)に下記のように設定する。

address=/cluster.local/10.0.0.7

test1.cluster.local,test2.cluster.localでアクセスすると、10.0.0.7で解決される。

DNSについて

詳細は下記の3.6以降のセクションを読んでください。その前まで読んで満足すると最新のアーキテクチャと違うのではまります

参考:  https://www.redhat.com/ja/blog/red-hat-openshift-container-platform-dns-deep-dive-dns-changes-red-hat-openshift-container-platform-36

OpenShift?上では各ノード上で下記のDNSが動いています。

  1. Dnsmasq(host ip:53)
  2. SkyDNS(127.0.0.1:53)
  3. SkyDNS(127.0.0.1:8053, masterノードのみ)

また、外部からコンテナにアクセスするためのDNSが別途OpenShift外部に必要となります。

3は2から呼ばれるようになっていて、ユーザが意識する必要はあります。各OpenShiftノード(master/node)からは、 1を参照するように設定します。

### /etc/resolv.conf

search cluster.local test.example.com
nameserver 192.168.1.3

cluster.localはOpenShiftのコンテナ名のためのsuffixで固定です。test.example.comは環境によりことなり、OpenShift?のホスト名(node,master)のsuffixです。(ose3-node1.test.example.comというホスト名を利用した例)

次に、dnsmasqを設定します。とは言っても、OpenShift?をインストールするとある程度自動で設定されます。 まず、コンテナの名前解決ように下記の設定がされます。

### /etc/dnsmasq.d/node-dnsmasq.conf

server=/in-addr.arpa/127.0.0.1
server=/cluster.local/127.0.0.1

コンテナ以外の名前解決については、自分で設定する必要があります。例えば、外部DNSを10.0.0.4とした場合、下記のような設定を自分で追加します。

### /etc/dnsmasq.d/upstream-dns.conf

server=10.0.0.4

### 外部DNS

外部のブラウザからアプリケーションの名前を解決するためのDNSが必要となります。Ansibleのインベントリの変数 openshift_master_default_subdomainで設定したホスト名を外部でLBのIPアドレスで解決するようにします。

server=8.8.8.8
address=/.apps.test.example.com/192.168.1.3

LBの設定については、また今度、、