containered cloud-native (ccn) roadshow 离线部署

CCN是一个不错的演示openshift之上,ci/cd, cloud-native, istio, serverless的演示教材,教学的内容非常丰富。

第一个模块,着重讲解如何拆分单体应用,以及拆分的应用如何上云。

第二个模块,讲解如何在线debug, 如何监控上云的应用

第三个模块,应用转换到服务网格service mesh/istio架构

第四个模块,应用使用无服务架构serverless/knative架构开发

培训过程视频

安装过程视频

不过 upstream 的 CCN 是基于 rh demo system 的,必须在线,这里就做了一个离线的版本,供给客户离线使用。

离线部署架构描述

本次CCN离线,是基于ocp 4.6.9 制作。一共有4个module。

做CCN的离线,主要有以下3部分工作

  • github 离线
  • maven, npm 离线
  • 需要的镜像离线

在实验室的部署架构如下,供参考:

可以看到,与标准的部署架构没什么区别,就是在helper节点上面,加了gogs, nexus。

安装介质下载

请到如下的链接,下载安装介质,注意,这个安装介质是基于ocp 4.6.9 制作。

链接: https://pan.baidu.com/s/1jJU0HLnZMnvCNMNq1OEDxA 密码: uaaw

其中包括如下类型的文件:

  • ocp4.tgz 这个文件包含了iso等安装介质,以及各种安装脚本,全部下载的镜像列表等。需要复制到宿主机,以及工具机上去。
  • registry.tgz 这个文件也是docker image registry的仓库打包文件。需要先补充镜像的话,按照这里操作: 4.6.add.image.md
  • nexus-image.tgz 这个是nexus的镜像仓库打包,集群的镜像proxy指向nexus,由nexus提供镜像的cache
  • poc.image.tgz 这个是给registry.tgz补充的一些镜像,主要是ccn使用,补充的镜像列表在这里 poc.image.list ,按照这里操作: 4.6.add.image.md

由于上传的时候,安装5G大小切分,下载以后,合并使用如下的命令范例:

cat registry.?? > registry.tgz

百度盘上还会有补丁文件,比如,当有一个 agnosticd.zip 文件时, 这个就是补丁文件,上传到helper上,替换ocp4.tgz解压缩出来的同名文件即可。

教材修订

教材根据上游的项目做了修订,主要是源代码,为了应对纯离线环境,做了小的修改。如果在教学现场,发现有步骤做不下去,多半是因为离线环境的问题,请参考教学视频录像,里面会有如何绕过离线环境问题的技巧。

基础ocp4.6环境的部署细节

  • 按照离线的方法安装ocp4,里面要特别注意要有这些安装细节
    • 部署nexus镜像仓库代理
    • 打上离线registries.conf的补丁,指向nexus
    • 给ingress配置真证书
    • 配置image registry
    • 配置sample operator,并打上image stream的补丁
    • 部署离线operator hub

ccn for ocp-4.6 安装步骤

建议用独立的ocp4集群来安装ccn教材,因为ccn教材会全局的激活多个operator,这些operator也许对集群中的其他环境有影响。

# on helper
# deploy gitea
export LOCAL_REG='registry.ocp4.redhat.ren:5443'
# export LOCAL_REG=''
# gogs_var_date='2020-07-06'
podman stop gitea
podman rm -fv gitea

mkdir -p /data/ccn/gitea

cd /data/ccn
podman create --name swap $LOCAL_REG/wangzheng422/gogs-fs:gitea-2020-12-26-1325 ls
podman cp swap:/gitea.tgz /data/ccn/gitea.tgz
podman rm -fv swap
tar zvxf gitea.tgz
rm -f gitea.tgz
chown -R 1000:1000 /data/ccn/gitea

podman run -d --name gitea \
  -v /data/ccn/gitea:/data:Z \
  -e USER_UID=1000 \
  -e USER_GID=1000 \
  -p 10080:3000 \
  -p 10022:22 \
  ${LOCAL_REG}/gitea/gitea:1.13.0

# deploy nexus for maven
mkdir -p /data/ccn/nexus
cd /data/ccn/
podman create --name swap $LOCAL_REG/wangzheng422/nexus-fs:maven-2020-12-25-2024 ls
podman cp swap:/nexus.tgz /data/ccn/nexus.tgz
podman rm -fv swap
tar zvxf nexus.tgz
rm -f nexus.tgz
chown -R 200 /data/ccn/nexus

podman run -d -p 8081:8081 --name nexus -v /data/ccn/nexus:/nexus-data:Z $LOCAL_REG/sonatype/nexus3:3.29.0


# deploy etherpad for notes
mkdir -p /data/ccn/etherpad
chown -R 5001 /data/ccn/etherpad

podman run -d -p 9001:9001 -it --name etherpad -v /data/ccn/etherpad:/opt/etherpad-lite/var:z $LOCAL_REG/etherpad/etherpad:latest

# deploy mta vscode extenstion to helper web server
mkdir -p /data/ccn/vscode
mkdir -p /var/www/html/ccn/
cd /data/ccn/vscode
podman create --name swap $LOCAL_REG/wangzheng422/imgs:mta-vscode-extension.vsix-2020-12-30-1012 ls
podman cp swap:/mta-vscode-extension.vsix /var/www/html/ccn/mta-vscode-extension.vsix
podman cp swap:/logo-eclipseche.svg /var/www/html/ccn/logo-eclipseche.svg
podman rm -fv swap


# agnosticd on helper
mkdir -p /data/pip3
cd /data/pip3
podman create --name swap $LOCAL_REG/wangzheng422/base-fs:pip3-whl-2020-07-05 ls
podman cp swap:/wheelhouse.tar.gz wheelhouse.tar.gz
tar vxf wheelhouse.tar.gz
podman rm -fv swap

pip3 install --user --upgrade -r wheelhouse/requirements.txt --no-index --find-links wheelhouse

# 集群证书
# ccn 环境,高度依赖ingress证书,需要配置一个公网CA签发的真证书,给 *.apps.ocp4.redhat.ren

# install chrome on kvm host
wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
yum install ./google-chrome-stable_current_*.rpm
google-chrome --no-sandbox --ignore-certificate-errors &

# fix js cache issue
cat << EOF >> /etc/hosts
127.0.0.1 maxcdn.bootstrapcdn.com ajax.googleapis.com at.alicdn.com cdnjs.cloudflare.com code.jquery.com
EOF

# 安装ccn环境的参数
# oc login -u kubeadmin
oc login -u system:admin
# TARGET_HOST="bastion.rhte-b5c8.openshiftworkshop.com"
OCP_USERNAME="system:admin"
WORKLOAD="ocp4-workload-ccnrd"
GUID=b5c8
USER_COUNT=2
MODULE_TYPE="m1;m2;m3;m4"
SSH_KEY=~/.ssh/helper_rsa
WZH_SUBDOMIN_BASE=base.ocp4.redhat.ren
WZH_REGISTRY_SERVER=nexus.ocp4.redhat.ren:8083
WZH_GOGS_SERVER=git.ocp4.redhat.ren:10080
WZH_WEB_SERVER=helper.ocp4.redhat.ren:8080

ssh-copy-id -i ~/.ssh/helper_rsa.pub root@localhost

# create users
BASE_DIR="/data/install"
mkdir -p ${BASE_DIR}
cd ${BASE_DIR}
/bin/rm -f ${BASE_DIR}/htpasswd
touch ${BASE_DIR}/htpasswd

for i in $(seq 1 $USER_COUNT)
do 
    htpasswd -Bb ${BASE_DIR}/htpasswd user${i} redhat
done

oc create secret generic htpasswd --from-file=${BASE_DIR}/htpasswd -n openshift-config

oc apply -f - <<EOF
apiVersion: config.openshift.io/v1
kind: OAuth
metadata:
  name: cluster
spec:
  identityProviders:
  - name: HTPassword
    mappingMethod: claim
    type: HTPasswd
    htpasswd:
      fileData:
        name: htpasswd
EOF

# oc delete secret htpasswd -n openshift-config

# 以下是安装步骤
# a TARGET_HOST is specified in the command line, without using an inventory file
oc project default
cd /data/ocp4/agnosticd/ansible
ansible-playbook -i localhost, ./configs/ocp-workloads/ocp-workload.yml \
    -e"ansible_ssh_private_key_file=${SSH_KEY}" \
    -e"ansible_user=root" \
    -e"ocp_username=${OCP_USERNAME}" \
    -e"ocp_workload=${WORKLOAD}" \
    -e"silent=False" \
    -e"guid=${GUID}" \
    -e"num_users=${USER_COUNT}" \
    -e"user_count=${USER_COUNT}" \
    -e"module_type=${MODULE_TYPE}" \
    -e"wzh_registry_server=${WZH_REGISTRY_SERVER}" \
    -e"wzh_gogs_server=${WZH_GOGS_SERVER}" \
    -e"wzh_web_server=${WZH_WEB_SERVER}" \
    -e"ansible_python_interpreter=/usr/bin/python3" \
    -e"subdomain_base=${WZH_SUBDOMIN_BASE}" \
    -v \
    -e"ACTION=create"

# 由于实验环境里面的演示网站,会用到一些在线的静态文件,如果客户端浏览器不能联网
# 或者不能沟通"快速"上网,那么需要给这些在线资源做dns解析,解析到平台的router上来
# 离线的安装介质里面,有static-html,用来提供这些静态文件服务。
# at.alicdn.com
# maxcdn.bootstrapcdn.com
# cdnjs.cloudflare.com
# ajax.googleapis.com
# code.jquery.com

# 以下是删除ccn的步骤,注意大部分的operator不会删除。
# a TARGET_HOST is specified in the command line, without using an inventory file
cd /data/ocp4/agnosticd/ansible
ansible-playbook -i localhost, ./configs/ocp-workloads/ocp-workload.yml \
    -e"ansible_ssh_private_key_file=${SSH_KEY}" \
    -e"ansible_user=root" \
    -e"ocp_username=${OCP_USERNAME}" \
    -e"ocp_workload=${WORKLOAD}" \
    -e"silent=False" \
    -e"guid=${GUID}" \
    -e"num_users=${USER_COUNT}" \
    -e"user_count=${USER_COUNT}" \
    -e"module_type=${MODULE_TYPE}" \
    -e"wzh_registry_server=${WZH_REGISTRY_SERVER}" \
    -e"wzh_gogs_server=${WZH_GOGS_SERVER}" \
    -e"wzh_web_server=${WZH_WEB_SERVER}" \
    -e"ansible_python_interpreter=/usr/bin/python3" \
    -e"subdomain_base=${WZH_SUBDOMIN_BASE}" \
    -v \
    -e"ACTION=remove"


做练习中需要注意的地方

# git 链接要改成gitea上的地址
# http://git.ocp4.redhat.ren:10080/root/cloud-native-workshop-v2m1-labs.git
# http://git.ocp4.redhat.ren:10080/root/cloud-native-workshop-v2m2-labs.git
# http://git.ocp4.redhat.ren:10080/root/cloud-native-workshop-v2m3-labs.git
# http://git.ocp4.redhat.ren:10080/root/cloud-native-workshop-v2m4-labs.git
# http://git.ocp4.redhat.ren:10080/root/vote-api.git
# http://git.ocp4.redhat.ren:10080/root/vote-ui.git

# oc 命令有引用镜像的地方,都要改成nexus上的地址
oc new-build --docker-image=nexus.ocp4.redhat.ren:8083/ubi8/openjdk-11 --binary --name=catalog-springboot -l app=catalog-springboot

# in module 4, nodeshift编译命令要改一下。
npm run nodeshift --  --dockerImage=nexus.ocp4.redhat.ren:8083/wangzheng422/imgs --imageTag=nodejs-10-wzh-2021-01-05

其他备忘

yum install -y wget jq

# Keycloak credentials: admin / 2kBdjDwcZK94
# STACK_ID: stacksq1xbet4os1uioep

todo

  • PPT