首页 > 技术文章 > Kubernetes 企业发行版、容器Pass平台 OpenShift4.3 规划裸机部署

37yan 2020-03-20 16:37 原文

红帽被IBM收购之后不知道搞什么鬼,openshift的社区版okd自从3.11发布后就在也没有更新过已经两年了,前两天去okd网站上看文档惊讶的发现lastet文档竟然更新了,详看之后发现是从openshift4.x文档原封不动搬过来的。。。既然文档更新了那估计okd4.x就快了。下面就用这个文档部署一个openshift4.3的集群

先说一下4.x对比3.x最直观的变化:

部署方案:部署对AWS、Azure、GCP等公有云部署支持的比较好,当然也提供了裸机部署方案

裸机部署:控制节点支持的操作系统只有rhcos,据说okd版是fedora-coreos,控制节点的部署是用kubeboot引导机的方式

集群维护:可以在web控制台上做到几乎任何维护操作

Operators:是一套 Kubernetes 应用程序开发框架,4.x会集成一个OperatorHub,开发者可以轻松的使用里面的部署框架部署服务,而无需考虑Kubernetes上的部署过程(运维危机感又来了)

容器引擎:运行时使用CRI-O,镜像管理使用podman,docker做工具人的机会都没有

其他改变:镜像仓库、集群dns、router(ingress)等

环境信息

IP 角色 主机名 系统 备注
192.168.1.1 dns|dhcp|lb|操作机|下载服务|代理服务 d.test.oc4.com centos7 生产环境请分开部署
192.168.1.2 引导节点 bootstrap.test.oc4.com rhcos 启动一个bootkube服务引导控制节点,控制节点部署好就可以下掉了
192.168.1.3 控制节点 m0.test.oc4.com rhcos  
192.168.1.4 控制节点 m1.test.oc4.com rhcos  
192.168.1.5 控制节点 m2.test.oc4.com rhcos  
192.168.1.6 工作节点 w0.test.oc4.com rhcos  
192.168.1.7 工作节点 w1.test.oc4.com rhcos  

在 d.test.oc4.com 配置:

  • 安装需要的软件

yum install -y dnsmasq httpd haproxy
  • 配置dns和dhcp

添加 /etc/dnsmasq.d/server.conf

no-resolv
server=223.5.5.5
max-cache-ttl=60
dns-forward-max=10000
cache-size=10000
clear-on-reload
log-queries
log-facility=/tmp/dnsmasq.log


#dhcp 配置
dhcp-range=192.168.1.2,192.168.1.7,12h
dhcp-option=3,192.168.1.1
dhcp-option=option:dns-server,192.168.1.1
dhcp-host=42:20:a5:1b:da:72,192.168.1.2
dhcp-host=42:20:a5:1b:da:73,192.168.1.3
dhcp-host=42:20:a5:1b:da:74,192.168.1.4
dhcp-host=42:20:a5:1b:da:75,192.168.1.5
dhcp-host=42:20:a5:1b:da:76,192.168.1.6
dhcp-host=42:20:a5:1b:da:77,192.168.1.7

# dns 配置
addn-hosts=/etc/dnsmasq.d/hosts
address=/.apps.test.oc4.com/192.168.1.1

# 集群内的etcd使用dns发现组建集群 srv-host=_etcd-server-ssl._tcp.test.oc4.com,etcd-0.test.oc4.com,2380,0,100 srv-host=_etcd-server-ssl._tcp.test.oc4.com,etcd-1.test.oc4.com,2380,0,100 srv-host=_etcd-server-ssl._tcp.test.oc4.com,etcd-2.test.oc4.com,2380,0,100

添加 /etc/dnsmasq.d/hosts

# 主机名部分 cluster_name=test base_domain=oc4.com
192.168.1.1 d.oc4.com
192.168.1.1 api.test.oc4.com
192.168.1.1 api-int.test.oc4.com
192.168.1.2 bootstarp.test.oc4.com
192.168.1.3 m0.test.oc4.com
192.168.1.4 m1.test.oc4.com
192.168.1.5 m2.test.oc4.com
192.168.1.6 w0.test.oc4.com
192.168.1.7 w1.test.oc4.com
# etcd部分  etcd-<index>.<cluster_name>.<base_domain>  n=控制节点数 index=n-1
192.168.1.3 etcd-0.test.oc4.com
192.168.1.4 etcd-1.test.oc4.com
192.168.1.5 etcd-2.test.oc4.com 

启动服务

systemctl enable --now dnsmasq

 

  • 配置httpd下载服务

修改/etc/httpd/conf/httpd.conf

<Directory />
    AllowOverride none
    #Require all denied
    Options Indexes FollowSymLinks
</Directory>
Alias   "/d"  "/data/www"

启动服务 

systemctl enable --now httpd
  • 准备需要的文件

mkdir -p /data/www
cd  /data/www

添加点火引导脚本(这个主要是等一下使用ios镜像引导rhcos系统时快速点火,省得手输参数)

bootstrap.sh

#!/bin/bash
/usr/libexec/coreos-installer -d xvda \
      -i http://d.test.oc4.com/d/okd/bootstrap.ign 
      -b http://d.test.oc4.com/d/rhcos-4.3.0-x86_64-metal.raw.gz                        

master.sh

#!/bin/bash
/usr/libexec/coreos-installer -d xvda \
      -i http://d.test.oc4.com/d/okd/master.ign 
      -b http://d.test.oc4.com/d/rhcos-4.3.0-x86_64-metal.raw.gz   

worker.sh

#!/bin/bash
/usr/libexec/coreos-installer -d xvda \
      -i http://d.test.oc4.com/d/okd/worker.ign 
      -b http://d.test.oc4.com/d/rhcos-4.3.0-x86_64-metal.raw.gz   

 准备openshift安装和客户端工具和rhco系统文件,到红帽网站上下载 https://cloud.redhat.com/openshift/install/metal/user-provisioned

wget https://mirror.openshift.com/pub/openshift-v4/clients/ocp/latest/openshift-install-linux-4.3.5.tar.gz         # 部署配置生成工具
wget https://mirror.openshift.com/pub/openshift-v4/clients/ocp/latest/openshift-client-linux.tar.gz          # oc工具
wget https://mirror.openshift.com/pub/openshift-v4/dependencies/rhcos/4.3/4.3.0/rhcos-4.3.0-x86_64-installer.iso   # 引导镜像
wget https://mirror.openshift.com/pub/openshift-v4/dependencies/rhcos/4.3/4.3.0/rhcos-4.3.0-x86_64-metal.raw.gz -O /data/www/rhcos-4.3.0-x86_64-metal.raw.gz
  • 配置haproxy实现LB

追加配置 /etc/haproxy/haproxy.cfg ,引导机完成工作后可以把bootstrap从负载均衡里面删除

frontend openshift-api-server
    bind *:6443
    default_backend openshift-api-server
    mode tcp
    option tcplog

backend openshift-api-server
    balance source
    mode tcp
    server bootstrap 192.168.1.2:6443 check
    server master0 192.168.1.3:6443 check
    server master1 192.168.1.4:6443 check
    server master2 192.168.1.5:6443 check

frontend machine-config-server
    bind *:22623
    default_backend machine-config-server
    mode tcp
    option tcplog

backend machine-config-server
    balance source
    mode tcp
    server bootstrap 192.168.1.2:22623 check
    server master0 192.168.1.3:22623 check
    server master1 192.168.1.4:22623 check
    server master2 192.168.1.5:22623 check

frontend ingress-https
    bind *:443
    default_backend ingress-https
    mode tcp
    option tcplog

backend ingress-https
    balance source
    mode tcp
    server worker0 192.168.1.6:443 check
    server worker1 192.168.1.7:443 check
  •  配置一个代理服务(在网关上配置,我的这个环境网关就是192.168.1.1)

因为这次部署需要的镜像全部在quay.io直接下载会很慢,而且这次的部署是全自动化的镜像不好预先下载,而且还要访问一些国外网络会比较慢,我在部署的过程中使用了透明代理

echo "net.ipv4.ip_forward = 1" >>/etc/sysctl.conf       
sysctl -p
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p tcp --dport 443 -j REDIRECT --to-ports 1081

 懂的都懂

  • 准备部署配置

创建安装配置文件install-config.yaml

apiVersion: v1
baseDomain: oc4.com
compute:
- hyperthreading: Enabled   
  name: worker
  replicas: 0 
controlPlane:
  hyperthreading: Enabled   
  name: master 
  replicas: 3 
metadata:
  name: test
networking:
  clusterNetwork:
  - cidr: 10.128.0.0/14 
    hostPrefix: 23 
  networkType: OpenShiftSDN
  serviceNetwork: 
  - 172.30.0.0/16
platform:
  none: {} 
fips: false 
pullSecret: '' 
sshKey: ''

pullSecret  到下载https://cloud.redhat.com/openshift/install/metal/user-provisioned

sshKey      是管理集群节点的ssh公钥

放到文件夹中待用

mkdir -p /data/www/oc
cp install-config.yaml /data/www/oc

创建kubernetes清单和系统点火文件

openshift-install create manifests --dir=/data/www/oc
openshift-install create ignition-configs --dir=/data/www/oc
  • 下面理一下文件

/data/www 对应的是 d.test.oc4.com/d

确保httpd服务有权限访问这些文件

chmod 755 -R /data/www
ls /data/www/
bootstrap.sh master.sh oc rhcos-4.3.0-x86_64-metal.raw.gz worker.sh

ls /data/www/oc/
auth bootstrap.ign master.ign metadata.json worker.ign
  • 部署引导主机(bootstrap.test.oc4.com)

使用rhcos-4.3.0-x86_64-installer.iso镜像启动系统,这边用的是xen,这里可以使用TAB编辑内核参数

coreos.inst=yes
coreos.inst.install_dev=xvda 
coreos.inst.image_url=http://d.test.oc4.com/d/rhcos-4.3.0-x86_64-metal.raw.gz
coreos.inst.ignition_url=http://d.test.oc4.com/d/okd/bootstrap.ign 
ip=dhcp

我这里没有选择编辑内核参数,因为在前期摸索的过程中可以要反复的还原重试,这里没法复制会输的比较心累

先按回车启动,会进入一个安装系统的终端,直接执行前面准备好的脚本

curl d.test.oc4.com/d/bootstrap.sh |bash

好了之后直接重启,重启完安装就自动开始了,也可以进到引导机系统观察引导集群的整个过程

ssh core@bootstarp.test.oc4.com
journalctl -b -f -u bootkube.service
  • 引导控制节点(m[0:2].test.oc4.com)

使用rhcos-4.3.0-x86_64-installer.iso镜像启动系统,启动完执行

curl d.test.oc4.com/d/master.sh |bash

装好重启之后会尝试连接 https://api-int.test.oc4.com:22632  当然需要引导节点初始化好才能连接

可以使用安装程序等待安装完成,30分钟显然是不够的,有代理的情况下要300分钟吧。。。

openshift-install --dir=/data/www/oc/ wait-for bootstrap-complete --log-level=info
INFO Waiting up to 30m0s for the Kubernetes API at https://api.test.oc4.com:6443... 

安装完成后,配置一下oc客户端访问权限

mkdir -p $HOME/.kube
cp -i  cp /data/www/oc/auth/kubeconfig $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

/data/www/okd/auth/kubeadmin-password 这个文件里面保存着kubeadmin的密码

  • 引导工作节点(w[0:1].test.oc4.com)

使用rhcos-4.3.0-x86_64-installer.iso镜像启动系统,启动完执行

curl d.test.oc4.com/d/worker.sh |bash

默认情况下需要批准一下节点的证书请求才能正常和master通信

yum install -y jq
oc get csr -ojson | jq -r '.items[] | select(.status == {} ) | .metadata.name' | xargs oc adm certificate approve

看一下所有节点是否正常

oc get node

NAME STATUS ROLES AGE VERSION
m0.test.oc4.com Ready master,worker 52m v1.16.2
m1.test.oc4.com Ready master,worker 52m v1.16.2
m2.test.oc4.com Ready master,worker 51m v1.16.2
w0.test.oc4.com Ready worker 5m59s v1.16.2
w1.test.oc4.com Ready worker 6m1s v1.16.2

可以把ingress router 安排在这两个节点:

先打上节点标签

oc label node w0.test.oc4.com node-role.router=router
oc label node w1.test.oc4.com node-role.router=router

注意不能直接编辑router的Deployment配置,需要编辑ingresscontroller

ingress-operator负责ingresscontroller生命周期管理,ingresscontroller负责调用haproxy实现

oc edit ingresscontroller default -n openshift-ingress-operator 
spec:
  nodePlacement:
    nodeSelector:
      matchLabels:
        node-role.router: router
  • 登陆web控制台

浏览器打开https://console-openshift-console.apps.test.oc4.com/ 可以先使用kubeadmin用户登陆

管理员控制台功能得到了加强,日常的集群维护都可以做

 开发者控制台也有很大的改动

 

推荐阅读