目前OCP v4 Installer Provisioned Infrastructure (IPI) 部署方式还不支持AWS中国区域,可以通过User Provisioned Infrastructure (UPI)方式安装部署OCP v4.
下面介绍OCP v4 UPI部署方法。
- AWS中国区域的帐号和AWS Global区域的账号。
- Red Hat 账号,用于下载installer和pull secret。 安装自动获得60天试用版Subscription。
- 已备案的域名,并在AWS Global区域Route53中已经建立Hosted Zone。
首先需要在您用于运行安装程序的电脑上安装并配置aws cli。具体步骤请参考AWS文档。
配置aws cli,添加两个profile. 详细步骤参考aws cli文档.
- global:配置AWS Global区域管理员的AK/SK,区域设置为ap-southeast-1.
- china: 配置AWS中国区管理员的AK/SK,区域设置为cn-northwest-1.
安装命令行json工具jq。具体步骤请参考jq wiki。
用Red Hat账号登录Infrastructure Provider, infrastructure provider选择AWS,安装方式选择user-provisioned infrastructure。
下载对应镜像版本和你的操作系统的OpenShift installer,在同一个页面下载pull secret和Command-line interface。
选择您将用来登录集群的ssh key。如果您还没有ssh key,可以用下面的命令生成。
ssh-keygen -t rsa -b 4096 -N '' -f <path>/<file_name>
指明生成的key的位置,例如"~/.ssh/id_rsa"。
并将ssh key加载到ssh agent中。
eval "$(ssh-agent -s)"
ssh-add <path>/<file_name>
设置CLUSTER_NAME环境变量.
export CLUSTER_NAME=myocpcluster
激活AWS中国区域的Profile。
export AWS_DEFAULT_PROFILE=china
按照需要更新vpc参数文件. 然后执行下面的命令新建VPC。
./scripts/1_create_vpc.sh
由于跨境网络原因,导致OCP安装从Quay.io上下载容器镜像时非常缓慢,为了保证安装能够顺利完成,需要先制作离线的本地镜像库。
制作镜像实例的详细步骤请参考OCP文档。
镜像实例请部署在上一步新建的VPC的公有子网中, 并在安全组入站规则中开放vpc网段对镜像服务器端口的访问。
请记录镜像实例过程中输出的3个信息,后面的安装步骤中会用到。
- 镜像仓库的ca证书: /opt/registry/certs/domain.crt的内容。例如:
-----BEGIN CERTIFICATE-----
many lines of data...
-----END CERTIFICATE-----
- 镜像仓库的pull secret,保存为mirror-pull-secret.txt。例如:
{
"auths": {
"cloud.openshift.com": {
"auth": "b3BlbnNo...",
"email": "[email protected]"
},
"quay.io": {
"auth": "b3BlbnNo...",
"email": "[email protected]"
},
"registry.connect.redhat.com": {
"auth": "NTE3Njg5Nj...",
"email": "[email protected]"
},
"<local_registry_host_name>:<local_registry_host_port>": {
"auth": "<credentials>",
"email": "[email protected]"
},
"registry.redhat.io": {
"auth": "NTE3Njg5Nj...",
"email": "[email protected]"
}
}
}
- 镜像命令成功后输出的imageContentSources,例如:
- mirrors:
- ip-10-0-11-240.cn-northwest-1.compute.internal:5000/ocp4/openshift4
source: quay.io/openshift-release-dev/ocp-release
- mirrors:
- ip-10-0-11-240.cn-northwest-1.compute.internal:5000/ocp4/openshift4
source: quay.io/openshift-release-dev/ocp-v4.0-art-dev
把上一步下载的OpenShift Installer解压,把openshift-installer程序复制到bin目录下。
把第3步中获得的pull secret生成pull-secret.json放到parameters目录下。
cat <mirror-pull-secret.txt> | jq -c . > parameters/pull-secret.json
激活AWS Global区域的Profile。
export AWS_DEFAULT_PROFILE=global
生成安装配置文件
./bin/openshift-install create install-config --dir=${CLUSTER_NAME}
根据命令行提示,选择SSH Public Key,Platform选择aws,Region选择ap-southeast-1 (Singapore), Base Domain选择要使用的Route53域名,Cluster Name设置为选择的集群名称,Pull Secret复制pull-secret.json的内容。
编辑${CLUSTER_NAME}/install-config.yaml,把worker的副本数量设置为0. 如下所示。
compute:
- hyperthreading: Enabled
name: worker
platform: {}
replicas: 0
增加additionalTrustBundle部分。这部分的内容必须是第4步,新建本地镜像服务器所使用的CA证书文件的内容。示例如下:
additionalTrustBundle: |
-----BEGIN CERTIFICATE-----
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
-----END CERTIFICATE-----
添加imageContentSources部分。这个是第4步同步镜像内容后输出的信息。示例如下:
imageContentSources:
- mirrors:
- <bastion_host_name>:5000/<repo_name>/release
source: quay.io/openshift-release-dev/ocp-release
- mirrors:
- <bastion_host_name>:5000/<repo_name>/release
source: quay.io/openshift-release-dev/ocp-v4.0-art-dev
然后运行下面的命令,生成集群的Kubernetes manifest
./bin/openshift-install create manifests --dir=${CLUSTER_NAME}
这个命令完成后,会新建一个名为${CLUSTER_NAME}的目录,下面有OCP集群相关的kubernetes声明文件。
删除control plane和worker node相关的声明文件, 后面使用CloudFormation新建。
rm -f ${CLUSTER_NAME}/openshift/99_openshift-cluster-api_master-machines-*.yaml
rm -f ${CLUSTER_NAME}/openshift/99_openshift-cluster-api_worker-machineset-*.yaml
编辑${CLUSTER_NAME}/manifests/cluster-scheduler-02-config.yml,把mastersSchedulable的值改为false.
编辑${CLUSTER_NAME}/manifests/cluster-dns-02-config.yml文件,注释掉privateZone和publicZone部分。后面我们会单独添加ingress DNS记录。
apiVersion: config.openshift.io/v1
kind: DNS
metadata:
creationTimestamp: null
name: cluster
spec:
baseDomain: example.openshift.com
# privateZone:
# id: mycluster-100419-private-zone
# publicZone:
# id: example.openshift.com
status: {}
把配置文件中ap-southeast-1相关内容替换成cn-northwest-1.
find ${CLUSTER_NAME} -type f -print0 | xargs -0 sed -i '' -e 's/ap-southeast-1/cn-northwest-1/g'
运行下面的命令,生成ignition文件。
./bin/openshift-install create ignition-configs --dir=${CLUSTER_NAME}
获取infrastructure ID
export InfraID=`jq -r .infraID ${CLUSTER_NAME}/metadata.json`
激活AWS中国区域的Profile。
export AWS_DEFAULT_PROFILE=china
如果你还没有在AWS中国区的Route53中新建Hosted Zone,用下面的命令新建BASE_DOMAIN对应的Hosted Zone。
export BASE_DOMAIN="example.com"
export CURRENT_DATE=`date`
export HostedZoneId=`aws route53 create-hosted-zone --name ${BASE_DOMAIN} --caller-reference "${CURRENT_DATE}" --endpoint-url=https://route53.amazonaws.com.cn | jq -r .HostedZone.Id`
更新parameters/2_elb_dns_params.json中的参数,运行下面的命令,新建ELB和DNS域名。
./scripts/2_create_elb_dns.sh
更新parameters/3_sg_params.json中的参数,运行下面的命令,新建ELB和DNS域名。
./scripts/3_create_sg.sh
更新parameters/4_bootstrap_node.json中的参数,运行下面的命令,新建bootrap实例。
./scripts/4_create_bootstrap_node.sh
更新parameters/4_bootstrap_node.json中的参数. 通过下面的命令获得CertificateAuthorities的值.
cat ${CLUSTER_NAME}/master.ign | jq -r .ignition.security.tls.certificateAuthorities[].source
运行下面的命令,新建control plane实例。
./scripts/5_create_control_plane_nodes.sh
配置KUBECONFIG,用oc查看集群的nodes.
export KUBECONFIG=${CLUSTER_NAME}/auth/kubeconfig
oc get nodes
过一段时间可以看到集群的master节点已经ready。
[ec2-user@ip-10-0-11-240 ~]$ oc get nodes
NAME STATUS ROLES AGE VERSION
ip-10-0-63-243.cn-northwest-1.compute.internal Ready master 34m v1.16.2
ip-10-0-78-164.cn-northwest-1.compute.internal Ready master 34m v1.16.2
ip-10-0-89-250.cn-northwest-1.compute.internal Ready master 34m v1.16.2
更新parameters/6_worker_node{01, 02, 03}.json中的参数。通过下面的命令获得CertificateAuthorities的值.
cat ${CLUSTER_NAME}/worker.ign | jq -r .ignition.security.tls.certificateAuthorities[].source
运行下面的命令,新建3个worker实例。
./scripts/6_create_worker_nodes.sh
观察新生成的CSR。
oc get csr
可以看到pending的证书签发请求。
[ec2-user@ip-10-0-11-240 ~]$ oc get csr
NAME AGE REQUESTOR CONDITION
csr-9xkxb 41m system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Pending
csr-btqjb 26m system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Pending
csr-cbwks 41m system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Pending
csr-ctphr 41m system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Pending
csr-fvj5s 11m system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Pending
csr-kg4w7 11m system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Pending
csr-m7w9j 26m system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Pending
csr-q9wfm 26m system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Pending
csr-zg5w8 11m system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Pending
仔细确认CSR是来自集群的worker节点后,批准CSR。
oc get csr -ojson | jq -r '.items[] | select(.status == {} ) | .metadata.name' | xargs oc adm certificate approve
需要重复几次csr批准过程,直到没有新的csr出现。
[ec2-user@ip-10-0-11-240 ~]$ oc get csr
NAME AGE REQUESTOR CONDITION
csr-6dr4k 11m system:node:ip-10-0-53-197.cn-northwest-1.compute.internal Approved,Issued
csr-9xkxb 52m system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Approved,Issued
csr-btqjb 37m system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Approved,Issued
csr-cbwks 52m system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Approved,Issued
csr-ctphr 52m system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Approved,Issued
csr-fvj5s 22m system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Approved,Issued
csr-kg4w7 22m system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Approved,Issued
csr-lxlkc 11m system:node:ip-10-0-78-244.cn-northwest-1.compute.internal Approved,Issued
csr-m7w9j 37m system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Approved,Issued
csr-q9wfm 37m system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Approved,Issued
csr-tb5mw 11m system:node:ip-10-0-88-145.cn-northwest-1.compute.internal Approved,Issued
csr-zg5w8 22m system:serviceaccount:openshift-machine-config-operator:node-bootstrapper Approved,Issued
然后可以看到集群的worker节点也变成ready。
[ec2-user@ip-10-0-11-240 ~]$ oc get nodes
NAME STATUS ROLES AGE VERSION
ip-10-0-53-197.cn-northwest-1.compute.internal Ready worker 11m v1.16.2
ip-10-0-63-243.cn-northwest-1.compute.internal Ready master 88m v1.16.2
ip-10-0-78-164.cn-northwest-1.compute.internal Ready master 88m v1.16.2
ip-10-0-78-244.cn-northwest-1.compute.internal Ready worker 11m v1.16.2
ip-10-0-88-145.cn-northwest-1.compute.internal Ready worker 11m v1.16.2
ip-10-0-89-250.cn-northwest-1.compute.internal Ready master 88m v1.16.2
更新parameters/7_ingress_dns_records.json中的参数,运行下面的命令,新建ingress controller的dns记录。
./scripts/7_create_ingress_dns_records.sh
等待control plane部署完成。
./bin/openshift-install wait-for bootstrap-complete --dir=${CLUSTER_NAME} --log-level=info
获得console URL
8c85909aaff7:ocp-v4 sunhua$ oc -n openshift-console get route/console
就可以通过HTTPS访问console route的URL。登录的用户名为kubeadmin,密码在${CLUSTER_NAME}/auth/kubeadmin-password文件中。
v4.3中cloud-credential-operator和ingress-operator对AWS中国区的支持还有些问题。
目前有两种处理方法。
- 关闭cloud-credential-operator,手工新建IAM用户,并把AK/SK更新到对应的Secret中。操作步骤请参考cloud-credential-operator文档.
- 使用hot fix版本。