开篇

本期视频,我们一起来手把手的搭建实验环境。为了节省资源,我们部署 All-In-One K8S环境,也就是所有 kubernetes 资源,运行在一台服务器上。

视频直达

第一部分视频

第二部分视频


安装工具

开始动手之前,我们来介绍两款工具,kubekey 和 k9s。

kubeykey 是 KubeSphere 团队基于 GoLang 语言开发的kubernetes集群部署工具,使用 KubeKey,您可以轻松、高效、灵活地单独安装和管理 Kubernetes,当然如果你部署 Kubesphere 也是非常方便的。

k9s是一款命令行下的 k8s 集群管理工具,可以非常有效地提高你对 k8s的管理效率。本次分享我们对k8s 资源的观察和操作,就是通过 k9s来实现的。

1. 安装 kubekey

kubekey release[1]

cd $HOME/kubekey

# 下载最新稳定版
wget https://github.com/kubesphere/kubekey/releases/download/v1.1.1/kubekey-v1.1.1-linux-amd64.tar.gz

# 解压缩
tar zxvf kubekey-v1.1.1-linux-amd64.tar.gz

# 删除说明文档
rm -rf README.md README_zh-CN.md kubekey-v1.1.1-linux-amd64.tar.gz

2.安装 k9s

k9s release[2]

cd $HOME

# 下载最新稳定版
wget https://github.com/derailed/k9s/releases/download/v0.24.15/k9s_Linux_x86_64.tar.gz

# 解压缩
tar zxvf k9s_Linux_x86_64.tar.gz

# 删除多余文件
rm -rf LICENSE README.md k9s_Linux_x86_64.tar.gz

部署k8s 环境

1. 生成 kubekey 配置


kubekey 通过 KKZONE 这个环境变量,来决定使用哪些容器镜像仓库,从而提高镜像资源的下载效率。

cd $HOME/kubekey

export KKZONE=cn


# 创建集群配置,集群名称为 monday
./kk create config --name monday

2. 修改配置


# 修改配置如下
apiVersion: kubekey.kubesphere.io/v1alpha1
kind: Cluster
metadata:
  name: monday
spec:
  hosts:
  - {name: tm-opsinit-01, address: 10.10.14.99, internalAddress: 10.10.14.99}
  roleGroups:
    etcd:
    - tm-opsinit-01
    master:
    - tm-opsinit-01
    worker:
    - tm-opsinit-01
  controlPlaneEndpoint:
    domain: monday-api.automan.fun
    address: ""
    port: 6443
  kubernetes:
    version: v1.19.8
    imageRepo: kubesphere
    clusterName: cluster.local
  network:
    plugin: calico
    kubePodsCIDR: 10.233.64.0/18
    kubeServiceCIDR: 10.233.0.0/18
  registry:
    registryMirrors: []
    insecureRegistries: []
  addons: []

3. 修改 docker 配置


docker daemon 默认创建的docker0网桥,使用172.17.0.0网段地址,如果你的服务器使用的172.17.0.0的网段,可以通过修改docker daemon的配置来修改docker0网桥的地址段,避免地址冲突。

# /etc/docker/daemon.json

{
  "log-opts": {
    "max-size": "5m",
    "max-file":"3"
  },
  "exec-opts": ["native.cgroupdriver=systemd"],
  "bip":"192.168.0.1/24"
}

修改完配置后,如果服务器上已安装docker服务,执行如下命令重载配置。如无运行docker服务,请忽略。

systemctl daemon-reload && systemctl restart docker

4. 创建集群


创建集群前,有三个点需要检查:

  1. 禁用 selinux

  2. 禁用防火墙

  3. 安装相关系统级依赖

# 临时禁用 selinux
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

# 禁用防火墙
systemctl disable firewalld && systemctl stop firewalld && systemctl status firewalld

# 安装系统依赖
yum install socat conntrack ebtables ipset

# 创建集群
./kk create cluster -f config-monday.yaml

5. 安装客户端


k8s 集群部署好后,我们来安装相关 kubectl管理工具。

# 添加 k8s yum 源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 安装 kubectl
yum install -y kubectl


# k8s 命令行参数很多,可以通过 bash-completion 来自动补全命令
# 命令行代码补全
yum install bash-completion -y
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc

部署 OpenELB

集群中的应用,如果要在集群外部访问,可以采用NodePort 方式暴露服务,也可以采用 LoadBalancer 的方式。为了更好的模拟生产环境,咱们使用 LoadBalancer 的方式暴露服务。OpenELB是由 Kubesphere 团队开发的支持裸金属服务器提供LoadBalancer类型服务的工具。具体功能细节就不额外讲解,大家可以自行参考官方文档。国人主导开发的工具,中文支持非常好。


Github: https://github.com/kubesphere/openelb

# 一条命令安装 porter
kubectl apply -f https://raw.githubusercontent.com/kubesphere/porter/master/deploy/porter.yaml

我们实验中使用OpenLBlayer2模式。这种模式需要配置一些集群主机网段的空地址,也就是说这些IP不能绑定物理网卡。OpenLB提供 Eip 这个CRD来配置这些空 IP。为什么需要这样的 IP 呢?我们来简单讲解下 Layer2 模式的原理。

当外部有流量请求某个空 IP时,路由器会发出ARP广播报文,也就是到集群服务器网段内询问,数据要发给谁。显然不会有任何一个主机响应,此时,OpenLBport-manager 就会相应这个 ARP 报文。通过这种ARP报文欺骗的黑客手段,实现流量的劫持。剩下的步骤,就由PortLB来转发流量到相应的Service 中。

PortLB 的 Layer2 模式,就是这样工作的。


apiVersion: network.kubesphere.io/v1alpha2
kind: Eip
metadata:
    name: eip-pool
spec:
    address: 10.10.14.91-10.10.14.92
    protocol: layer2
    interface: ens192
    disable: false
 
# 10.10.14.87-10.10.14.88

部署 nginx-ingress

OpenLB可以方便地暴露 4 层协议,比如 TCP协议等等,但在7 层协议中的一些操作,就无能为力啦,比如卸载 https 证书路由分发等等。


nginx-ingress install guide[3]

# 1. 应用配置清单
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/cloud/deploy.yaml

# 2. 修改 service 类型为 LoadBalancer

# 3. service.metadata.annotations 中指定 OpenELB 配置

lb.kubesphere.io/v1alpha1: porter
protocol.porter.kubesphere.io/v1alpha1: layer2

# PortLB 就是通过这两条 annotation 信息来识别要提供服务的 Service 的

openEBS

Kubernates 集群中,对于有状态应用,需要申请PV支持。openEBS支持把节点主机的文件系统映射为存储服务,这对我们的 All In One 实验来说,是个非常好的支持。

安装 helm


OpenEBS 官方支持 helm 安装,所以我们首先安装 helm 命令行工具。

curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
echo 'PATH=$PATH:/usr/local/bin' >> ~/.bashrc && source ~/.bashrc

安装 openebs


helm repo add openebs https://openebs.github.io/charts
helm repo update
helm install openebs --namespace openebs openebs/openebs --create-namespace

验证 hostpath


# /var/openebs/local
kubectl apply -f https://openebs.github.io/charts/examples/local-hostpath/local-hostpath-pvc.yaml
kubectl apply -f https://openebs.github.io/charts/examples/local-hostpath/local-hostpath-pod.yaml

安装 metric server

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# bx509: cannot validate certificate for because it doesn't contain any IP SANs"
# metric server deployment args 
# 添加
# - --kubelet-insecure-tls

总结

到这里,我们的实验环境就搭建完成啦;涉及到的知识点非常多,因为搭建集群并非我们课程的主要内容,就不继续给大家扩展知识了。如果有疑问或者遇到什么问题,可以留言或到我们的社区群众交流群中,一起探讨。

给大家留个作业:再找一台服务器,按照本节课的步骤,部署另外一套 kubernates集群,集群名叫 tuesday。后面咱们实验多集群管理时,会用到。

下期视频,我们将部署 ArgoCD 并且跑个官方 demo 让大家感受一下。

参考资料

[1]

kubekey release: https://github.com/kubesphere/kubekey/releases

[2]

k9s release: https://github.com/derailed/k9s/releases

[3]

nginx-ingress install guide: https://kubernetes.github.io/ingress-nginx/deploy/

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐