一 前置條件說明 1.1 安裝準備概述 Red Hat OpenShift容器平臺是由Red Hat作為RPM包和容器映像兩種類型存在。RPM包使用訂閱管理器從標準Red Hat存儲庫(即Yum存儲庫)下載,容器映像來自Red Hat私有倉庫。 OpenShift容器平臺安裝需要多個伺服器,支持服務 ...
一 前置條件說明
1.1 安裝準備概述
Red Hat OpenShift容器平臺是由Red Hat作為RPM包和容器映像兩種類型存在。RPM包使用訂閱管理器從標準Red Hat存儲庫(即Yum存儲庫)下載,容器映像來自Red Hat私有倉庫。 OpenShift容器平臺安裝需要多個伺服器,支持伺服器或虛擬機的多種形式。同時為了簡化OpenShift集群的部署,Red Hat提供了一個基於Ansible的安裝程式,它可以通過交互運行,也可以使用包含環境配置細節的應答文件以自動的非交互方式運行。 在運行安裝程式之前,需要執行一些預安裝任務,以及安裝後的安裝任務,以獲得功能齊全的OpenShift容器平臺集群。RedHat為安裝OpenShift容器平臺提供了兩種不同的方法。- 第一種方法使用快速安裝程式,可用於簡單的集群設置。
- 第二種方法是較為精細的安裝方式,並使用Ansible playbook來自動化該過程。
1.2 節點準備
需要相應的master和node節點互通,並且配置master至所有節點的免秘鑰登錄。同時能解析所有FQDN,及註冊相應repo庫。 提示:以上準備工作也可通過Ansible直接跑相應的yml完成。二 實驗一:前置條件操作
2.1 環境準備
[student@workstation ~]$ lab install-prepare setup #運行準備腳本提示:本環境基於RedHat RH280環境,所有lab命令為環境自動化準備命令,後續不再贅述。2.2 安裝Ansible
[student@workstation ~]$ rpm -qa | grep ansible [student@workstation ~]$ sudo yum -y install ansible2.3 驗證Ansible
[student@workstation ~]$ cd /home/student/DO280/labs/install-prepare/ [student@workstation ~]$ ansible --version [student@workstation install-prepare]$ cat ansible.cfg [student@workstation install-prepare]$ cat inventory Inventory文件解釋: Inventory定義了六個主機組:- workstations:為developer節點,即運行playbook的節點;
- nfs:為集群存儲提供nfs服務的環境中的vm;
- masters:OpenShift集群中用作master角色的節點;
- etcd:用於OpenShift集群的etcd服務的節點,本環境中使用master節點;
- node:OpenShift集群中的node節點;
- OSEv3:組成OpenShift集群的所有接待,包括master、etcd、node或nfs組中的節點。
2.4 檢查節點連通性
[student@workstation install-prepare]$ cat ping.yml1 --- 2 - name: Verify Connectivity 3 hosts: all 4 gather_facts: no 5 tasks: 6 - name: "Test connectivity to machines." 7 shell: "whoami" 8 changed_when: false[student@workstation install-prepare]$ ansible-playbook -v ping.yml
2.5 確認yml
[student@workstation install-prepare]$ cat prepare_install.yml 解釋:如上yml引入了三個role。 docker-storage內容如下,該role定義相關docker的後端存儲驅動以及創建docker所需的image存儲路徑,並最終啟動docker。 [student@workstation install-prepare]$ cat roles/docker-storage/tasks/main.yml1 --- 2 - block: 3 - name: Customize default /etc/sysconfig/docker-storage-setup 4 template: 5 src: docker-storage-setup 6 dest: /etc/sysconfig/docker-storage-setup 7 owner: root 8 group: root 9 mode: 0644 10 when: not use_overlay2_driver 11 - name: Customize /etc/sysconfig/docker-storage-setup using overlay2 storage driver 12 template: 13 src: docker-storage-setup-overlay2 14 dest: /etc/sysconfig/docker-storage-setup 15 owner: root 16 group: root 17 mode: 0644 18 when: use_overlay2_driver 19 - name: Verify existence of /dev/docker-vg/docker-pool 20 stat: 21 path: /dev/docker-vg/docker-pool 22 register: p 23 - name: Stop docker 24 service: 25 name: docker 26 state: stopped 27 when: p.stat.exists == False 28 - name: Remove loopback docker files 29 file: 30 dest: /var/lib/docker 31 state: absent 32 when: p.stat.exists == False 33 - name: Run docker-storage-setup 34 command: /usr/bin/docker-storage-setup 35 when: p.stat.exists == False 36 - name: Start and enable docker 37 service: 38 name: docker 39 state: started 40 when: p.stat.exists == False 41 when: docker_storage_device is defined 42[student@workstation install-prepare]$ cat roles/docker-storage/templates/docker-storage-setup
1 DEVS={{ docker_storage_device }} 2 VG=docker-vg 3 SETUP_LVM_THIN_POOL=yesdocker-registry-cert內容如下,該role定義相關docker的使用私有倉庫,並且導入了相關crt證書。
[student@workstation install-prepare]$ cat roles/docker-registry-cert/tasks/main.yml
1 --- 2 - name: Enable the Trust 3 shell: update-ca-trust enable 4 - name: Retrieve the certificate 5 fetch: 6 src: "{{ cacert }}" 7 dest: "{{ local_destination }}" 8 delegate_to: "{{ registry_host }}" 9 - name: Copy the certificate 10 copy: 11 src: "{{ source }}" 12 dest: "{{ destination }}" 13 owner: root 14 group: root 15 mode: 0755 16 - name: Update the Trust 17 shell: update-ca-trust extract 18 - name: Restart Docker 19 service: 20 name: docker 21 state: restarted 22[student@workstation install-prepare]$ cat roles/docker-registry-cert/vars/main.yml
1 registry_host: services.lab.example.com 2 cacert: /etc/pki/tls/certs/example.com.crt 3 local_destination: /tmp/ 4 source: "/tmp/{{ ansible_fqdn }}/etc/pki/tls/certs/example.com.crt" 5 destination: /etc/pki/ca-trust/source/anchors/example.com.crtopenshift-node內容如下,該role定義相關安裝OpenShift所需的所有依賴包任務。
[student@workstation install-prepare]$ ll roles/openshift-node/files/ total 4 -rw-r--r--. 1 student student 389 Jul 19 2018 id_rsa.pub [student@workstation install-prepare]$ cat roles/openshift-node/meta/main.yml
1 --- 2 dependencies: 3 - { role: docker }[student@workstation install-prepare]$ cat roles/openshift-node/tasks/main.yml
1 --- 2 - name: Deploy ssh key to root at all nodes 3 authorized_key: 4 user: root 5 key: "{{ item }}" 6 with_file: 7 - id_rsa.pub 8 - name: Install required packages 9 yum: 10 name: "{{ item }}" 11 state: latest 12 with_items: 13 - wget 14 - git 15 - net-tools 16 - bind-utils 17 - iptables-services 18 - bridge-utils 19 - bash-completion 20 - kexec-tools 21 - sos 22 - psacct 23 - atomic-openshift-clients 24 - atomic-openshift-utils 25 - atomic-openshift 26
2.6 運行playbook
[student@workstation ~]$ cd /home/student/DO280/labs/install-prepare/ [student@workstation install-prepare]$ ansible-playbook prepare_install.yml 提示:該準備工作將完成如下操作:- 在每個節點上安裝並運行Docker;
- 在每個節點上Docker使用一個邏輯捲存儲;
- 每個節點使用自簽名證書信任私有Docker倉庫;
- 在每個節點上都會安裝基本包。
2.7 確認驗證
[student@workstation install-prepare]$ for vm in master node1 node2; do echo -e "\n$vm" ssh $vm sudo systemctl status docker | head -n3 done #驗證docker服務 [student@workstation install-prepare]$ for vm in master node1 node2; do echo -e "\n$vm : lvs" ssh $vm sudo lvs echo -e "\n$vm : df -h" ssh $vm sudo df -h | grep vg-docker done #查看docker使用的lvm [student@workstation install-prepare]$ for vm in master node1 node2; do echo -e "\n$vm" ssh $vm docker pull rhel7:latest done #測試pull image [student@workstation install-prepare]$ for vm in master node1 node2; do echo -e "\n$vm" ssh $vm rpm -qa wget git net-tools bind-utils \ yum-utils iptables-services bridge-utils bash-completion \ kexec-tools sos psacct atomic-openshift-utils done #檢查相關依賴包是否安裝成功三 正式安裝說明
3.1 安裝步驟
安裝準備完成後正式安裝包括四個步驟:- 編寫一個目錄文件來描述所需的集群特性和體繫結構;
- 執行prerequisites.yml的playbook;
- 執行deploy_cluster,yml的playbook;
- 驗證安裝。
3.2 安裝和配置節點
OpenShift Inventory定義了以下主機組。 master:對於OpenShift,這是必須的組,定義了OpenShift集群中哪些主機充當master節點; node:對於OpenShift,這是必須的組,它定義了OpenShift集群中哪些主機充當node節點; etcd:[master]部分中列出的所有主機也應屬於etcd; nfs:這個組是可選的,應該只包含一個主機。如果Inventory文件中存在特定的變數,OpenShift playbook將在這台機器上安裝並配置NFS; OSEv3:這個組包含任何屬於OpenShift集群的機器。安裝劇本引用這個組來運行在集群全範圍內的任務。 [student@workstation install-prepare]$ cat inventory 說明:- 安裝所需版本的OpenShift容器平臺;
- 用戶使用htpasswd身份驗證對集群進行身份驗證;
- DNS條目apps.lab.example.com用作OpenShift應用程式的子域;
- NFS存儲用於OpenShift etcd服務和OpenShift 內部倉庫;
- classroom container registry用作倉庫。
- 一個內部容器倉庫;
- Gluster、Ceph等以便於提供持久性存儲;
- 集群日誌;
- 自定義集群證書。
3.3 配置OpenShift版本
可通過在[OSEv3:vars]中指定如下配置確定OpenShift所安裝的版本: openshift_deployment_type=openshift-enterprise openshift_release=v3.9 指定OpenShift部署類型,可選值為openshift-enterprise和origin。 openshift_image_tag=v3.9.14 openshift_disable_check=disk_availability,docker_storage,memory_availability 容器化的OpenShift服務使用帶有“v3.9.14”標記的圖像。這將阻止集群自動升級到更新的容器映像; 對於非生產集群,可以禁用對系統需求的檢查。3.4 配置驗證
OpenShift容器平臺身份驗證基於OAuth, OAuth提供了一個基於HTTP的APl,用於對互動式和非互動式客戶端進行身份驗證。 OpenShift master運行一個OAuth伺服器,OpenShift可以支持多種Provider,這些Provider可以與特定於組織的身份管理產品集成。支持的OpenShift身份驗證的Provider:- HTTP Basic,外部單點登錄(SSO)系統;
- 使用GitHub和GitLab帳號;
- OpenID連接,使用OpenID-compatible SSO和谷歌帳戶;
- OpenStack Keystone v3;
- LDAP v3伺服器。
3.5 配置htpasswd驗證
OpenShift HTPasswdPasswordIdentityProvider根據Apache HTTPD htpasswd程式生成的文件驗證用戶和密碼。 htpasswd程式將用戶名和密碼保存在純文本文件中,每行一條記錄,欄位用冒號分隔。密碼使用MD5散列。如果將此文件添加或刪除用戶,或更改用戶密碼,OpenShift OAuth伺服器將自動重新讀取該文件。 要將OpenShift master配置使用HTPasswdPasswordIdentityProvider,需要配置openshift_master_identity_providers。1 openshift_master_identity_providers。 2 openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true', 3 'challenge': 'true', 'kind': 'HTPasswdPasswordIdentityProvider', #配置後端驅動 4 'filename': '/etc/origin/master/htpasswd'}] #制定master主機上也支持在配置文件中直接指定初始的用戶名和密碼。 openshift_master_htpasswd_users="{'user1':'$apr1$.NHMsZYc$MdmfWN5DM3q280/W7c51c/', 'user2':'$apr1$.NHMsZYc$MdmfWN5DM3q280/W7c51c/'}" 生產hash密碼可參考如下:
1 [student@workstation ~]$ htpasswd -nb admin redhat 2 [student@workstation ~]$ openssl passwd -apr1 redhat
3.6 網路要求
集群節點的通配符DNS條目允許任何新創建的路由自動路由到subdomain的集群。通配符DNS條目必須存在於唯一的子域中,例如apps.mycluster.com,並解析為主機名或集群節點的IP地址。inventory文件中通配符DNS條目是通過變數openshift_master_default_subdomain進行設置 。 openshift_master_default_subdomain=apps.mycluster.com3.7 master服務埠
主服務埠openshift_master_api_port變數定義主API的監聽埠。預設埠8443,當master使用SSL時,也可以使用443埠。從而在連接的時候省略埠號。 master console埠由openshift_master_console_port變數的值設置,預設埠是8443。master console埠也可以設置為443,從而在連接的時候省略埠號。 3.8 防火牆 OpenShift節點上的預設防火牆服務是iptables。若要在所有節點上使用firewalld作為防火牆服務,需要將操作系統防火牆使用firewalld變數設置為true,即os_firewall_use_firewalld=true。四 配置持久化存儲
4.1 持久存儲配置
預設情況下,容器數據是臨時的,並且在容器被銷毀時丟失。Kubernetes持久捲框架為容器請求和使用持久存儲提供了一種機制。為了避免數據丟失,這些服務被配置為使用持久捲。 OpenShift支持多個插件,使用各種存儲技術創建持久捲。可以使用NFS、iSCSI、GlusterFS、Ceph或其他商業雲存儲。 本環境中,OpenShift容器registry和OpenShift Ansible Broker服務被配置為使用NFS持久性存儲。 提示:生產環境預設OpenShift不支持NFS持久存儲集群,要允許NFS在非生產集群上持久存儲,需要配置openshift_enable_unsupported_configurations=true。4.2 container倉庫
要為OpenShift容器registry配置NFS持久性存儲,請將以下內容添加到Inventory文件中:1 openshift_hosted_registry_storage_kind=nfs 2 openshift_hosted_registry_storage_nfs_directory=/exports 3 openshift_hosted_registry_storage_volume_name=registry 4 openshift_hosted_registry_storage_nfs_options='*(rw,root_squash)' 5 openshift_hosted_registry_storage_volume_size=40G 6 openshift_hosted_registry_storage_access_modes=['ReadWriteMany']
4.3 OpenShift Ansible Broker
OpenShift Ansible Broker(OAB)是一個容器化的OpenShift服務,部署自己的etcd服務。持久Etcd存儲所需的配置與registry所需的配置類似。1 openshift_hosted_etcd_storage_kind=nfs 2 openshift_hosted_etcd_storage_nfs_directory=/exports 3 openshift_hosted_etcd_storage_volume_name=etcd-vol2 4 openshift_hosted_etcd_storage_nfs_options="*(rw,root_squash,sync,no_wdelay)" 5 openshift_hosted_etcd_storage_volume_size=1G 6 openshift_hosted_etcd_storage_access_modes=["ReadWriteOnce"] 7 openshift_hosted_etcd_storage_labels={'storage': 'etcd'}
五 OpenShift其他配置
5.1 配置離線本地registry
本環境OpenShift使用容器倉庫為registry.lab.example.com,要將集群配置為從內部倉庫pull image,需要在Inventory中進行如下配置:1 #Modifications Needed for a Disconnected Install 2 oreg_url=registry.lab.example.com/openshift3/ose-${component}:${version} 3 #可訪問image倉庫的位置,必須以ose-${component}:${version}結尾。 4 openshift_examples_modify_imagestreams=true 5 #OpenShift安裝了用於部署示例應用程式的模板。這個變數指示playbook修改所有示例的IS,使其指向私有倉庫,而不是registry.access.redhat.com。 6 openshift_docker_additional_registries=registry.lab.example.com 7 #此變數用於將本地可訪問倉庫添加到每個節點上的docker配置中。 8 openshift_docker_blocked_registries=registry.access.redhat.com,docker.io 9 #此變數用於在OpenShift節點上配置docker的blocked_registries。
1 #Image Prefix Modifications 2 openshift_web_console_prefix=registry.lab.example.com/openshift3/oseopenshift_cockpit_deployer_prefix='registry.lab.example.com/openshift3/' 3 openshift_service_catalog_image_prefix=registry.lab.example.com/openshift3/osetemplate_service_broker_prefix=registry.lab.example.com/openshift3/oseansible_service_broker_image_prefix=registry.lab.example.com/openshift3/oseansible_service_broker_etcd_image_prefix=registry.lab.example.com/rhel7/#通過在容器image名稱前面加上registry.lab.example.com以確保OpenShift服務的容器image可以從私有內部倉庫下載。