From 0e0da26cd6dfcda1b996b55eaa20ed845cc64aa8 Mon Sep 17 00:00:00 2001 From: DCCooper <1866858@gmail.com> Date: Thu, 1 Apr 2021 19:23:03 +0800 Subject: [PATCH] docs:add CloudNative SIG documents Signed-off-by: DCCooper <1866858@gmail.com> --- README.en.md | 3 + README.md | 3 + .../.gitkeep" | 0 ...03\350\257\225\346\226\271\346\263\225.md" | 406 +++++ .../.gitkeep" | 0 ...50\347\275\262\346\214\207\345\215\227.md" | 1528 +++++++++++++++++ ...02\350\241\214\345\212\236\346\263\225.md" | 13 + .../.gitkeep" | 0 "docs/4-\345\205\266\344\273\226/.gitkeep" | 0 docs/README.md | 15 + 10 files changed, 1968 insertions(+) create mode 100644 "docs/1-\345\274\200\345\217\221\346\214\207\345\215\227/.gitkeep" create mode 100644 "docs/1-\345\274\200\345\217\221\346\214\207\345\215\227/k8s\351\233\206\347\276\244\346\234\254\345\234\260\346\265\213\350\257\225\350\260\203\350\257\225\346\226\271\346\263\225.md" create mode 100644 "docs/2-\347\224\250\346\210\267\346\214\207\345\215\227/.gitkeep" create mode 100644 "docs/2-\347\224\250\346\210\267\346\214\207\345\215\227/k8s\344\272\214\350\277\233\345\210\266\351\203\250\347\275\262\346\214\207\345\215\227.md" create mode 100644 "docs/2-\347\224\250\346\210\267\346\214\207\345\215\227/k8s\351\225\234\345\203\217\345\217\221\345\270\203\346\265\201\347\250\213\346\232\202\350\241\214\345\212\236\346\263\225.md" create mode 100644 "docs/3-\347\211\271\346\200\247\346\214\207\345\215\227/.gitkeep" create mode 100644 "docs/4-\345\205\266\344\273\226/.gitkeep" create mode 100644 docs/README.md diff --git a/README.en.md b/README.en.md index 0e418ae..e4d53bf 100644 --- a/README.en.md +++ b/README.en.md @@ -10,6 +10,9 @@ CloudNative SIG is committed to providing a convenient and easy-to-use cloud nat - Responsible for the planning, maintenance, and upgrade of cloud-native-related packages - Respond to user feedback from software within the SIG group in a timely manner to resolve related issues +## SIG Documents +- [Documents](docs/README.md) + # SIG Meetings - Every Tuesday from 4:00-5:30 p.m - Declare the issue by mail diff --git a/README.md b/README.md index 63008c3..26f9a21 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,9 @@ CloudNative SIG致力于为广大用户、开发者、爱好者提供便捷、 - 负责云原生相关软件包的规划、维护和升级 - 及时响应SIG组内软件的用户反馈,解决相关问题 +## 项目文档 +- [Documents](docs/README.md) + # 组织会议 - 每双周周二下午4:00-5:30 diff --git "a/docs/1-\345\274\200\345\217\221\346\214\207\345\215\227/.gitkeep" "b/docs/1-\345\274\200\345\217\221\346\214\207\345\215\227/.gitkeep" new file mode 100644 index 0000000..e69de29 diff --git "a/docs/1-\345\274\200\345\217\221\346\214\207\345\215\227/k8s\351\233\206\347\276\244\346\234\254\345\234\260\346\265\213\350\257\225\350\260\203\350\257\225\346\226\271\346\263\225.md" "b/docs/1-\345\274\200\345\217\221\346\214\207\345\215\227/k8s\351\233\206\347\276\244\346\234\254\345\234\260\346\265\213\350\257\225\350\260\203\350\257\225\346\226\271\346\263\225.md" new file mode 100644 index 0000000..86e19c5 --- /dev/null +++ "b/docs/1-\345\274\200\345\217\221\346\214\207\345\215\227/k8s\351\233\206\347\276\244\346\234\254\345\234\260\346\265\213\350\257\225\350\260\203\350\257\225\346\226\271\346\263\225.md" @@ -0,0 +1,406 @@ +# k8s集群本地调试、测试方法 +## 部署集群 + +本教程是通过`kubeadm`一键式部署k8s集群,如果想通过二进制部署集群,请参考:https://docs.openeuler.org/zh/docs/21.03/docs/Kubernetes/Kubernetes.html + +### 组件信息 + +- OS:openEuler **21.03** +- Kubernetes:**1.20.2** +- Docker:**18.9.0** +- iSulad: **2.0.8** + +yum 源地址:https://repo.openeuler.org/openEuler-21.03/ + +**NOTE:**需保证**版本配套一致**,即所有组件均出自**同一OS版本**,此处为**openEuler 21.03** + +### 集群规划 + +| 角色 | IP | 组件/镜像 | +| ------- | --------------- | ------------------------------------------------------------ | +| master | 192.168.100.101 | kubeadm,kube-apiserver,kube-controller-manager,kube-scheduler,kubelet,etcd | +| worker1 | 192.168.100.201 | kubelet,kube-proxy | +| worker2 | 192.168.100.202 | kubelet,kube-proxy | +| worker3 | 192.168.100.203 | kubelet,kube-proxy | + +### 环境准备 + +默认已有虚拟机环境(虚拟机镜像获取地址)。 + +```bash +# 关闭防火墙 +systemctl stop firewalld +systemctl disable firewalld + +# 禁用selinux +setenforce 0 + +# 网络配置,开启相应的转发机制 +cat >> /etc/sysctl.d/k8s.conf <> /etc/hosts << EOF +192.168.100.101 master +192.168.100.201 worker1 +192.168.100.202 worker2 +192.168.100.203 worker3 +EOF + +# 同步时钟,选择可以访问的NTP服务器即可 +ntpdate cn.pool.ntp.org +``` + +> 以上操作需要在**所有节点**执行 + +### 配置容器引擎 + +k8s可以对接多种CRI,以下操作用户可以**二选一**。 + +本文中使用Docker作为对接k8s的CRI。 + +#### 配置iSulad + +```bash +# 安装iSulad +yum install -y iSulad +# 配置iSulad +cat /etc/isulad/daemon.json +{ + "registry-mirrors": [ + "docker.io" + ], + "insecure-registries": [ + "k8s.gcr.io", + "quay.io", + "hub.oepkgs.net" + ], + "pod-sandbox-image": "k8s.gcr.io/pause:3.2", # pause镜像设置 + "network-plugin": "cni", # 置空表示禁用cni网络插件则下面两个路径失效,安装插件后重启isulad即可 + "cni-bin-dir": "/opt/cni/bin", + "cni-conf-dir": "/etc/cni/net.d", +} + +# 如果不能直接访问外网,则需要配置proxy,否则不需要 +cat /usr/lib/systemd/system/isulad.service +[Service] +Type=notify +Environment="HTTP_PROXY=http://..." +Environment="HTTPS_PROXY=http://..." + +# 重启iSulad并设置为开机自启 +systemctl daemon-reload && systemctl restart isulad +``` + +> 以上操作需要在**所有节点**执行 + +#### 配置Docker + +```bash +# 为docker添加insecure registry +cat /etc/sysconfig/docker +INSECURE_REGISTRY="--insecure-registry k8s.gcr.io --insecure-registry quay.io --insecure-registry hub.oepkgs.net" + +# 如果不能直接访问外网,则需要配置proxy,否则不需要 +cat /etc/systemd/system/docker.service.d/http-proxy.conf +[Service] +Environment="HTTP_PROXY=http://..." +Environment="HTTPS_PROXY=http://..." +Environment="http_proxy=http://..." +Environment="https_proxy=http://..." +Environment="NO_PROXY=..." + +# 重启docker +systemctl daemon-reload && systemctl restart docker +``` + +> 以上操作需要在**所有节点**执行 + +### 安装k8s组件 + +```bash +# cri-tools 网络工具 +# x86 +wget --no-check-certificate https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.20.0/crictl-v1.20.0-linux-amd64.tar.gz +tar zxvf crictl-v1.19.0-linux-amd64.tar.gz -C /usr/local/bin +# arm +wget --no-check-certificate https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.20.0/crictl-v1.20.0-linux-arm64.tar.gz +tar zxvf crictl-v1.19.0-linux-arm64.tar.gz -C /usr/local/bin + +# cni 网络插件 +# x86 +wget --no-check-certificate https://github.com/containernetworking/plugins/releases/download/v0.9.0/cni-plugins-linux-amd64-v0.9.0.tgz +mkdir -p /opt/cni/bin +tar -zxvf cni-plugins-linux-amd64-v0.9.0.tgz -C /opt/cni/bin +# arm +wget --no-check-certificate https://github.com/containernetworking/plugins/releases/download/v0.9.0/cni-plugins-linux-arm64-v0.9.0.tgz +mkdir -p /opt/cni/bin +tar -zxvf cni-plugins-linux-arm64-v0.9.0.tgz -C /opt/cni/bin + +# 安装k8s组件 +# 注意:如果全部使用openEuler-21.03版本,可以支持直接yum安装 +# master节点执行 +yum install kubernetes-master kubernetes-kubeadm kubernetes-client +# worker节点执行 +yum install kubernetes-node kubernetes-kubelet +# 开机启动kubelet +systemctl enable kubelet --now +``` + +> 以上操作需要在**所有节点**执行 + +### 部署master节点 + +```bash +# 注意,init之前需要取消系统环境中的proxy +unset `env | grep -iE "tps?_proxy" | cut -d= -f1` +env | grep proxy + +# 使用kubeadm init +kubeadm init --kubernetes-version v1.20.2 --pod-network-cidr=10.244.0.0/16 --upload-certs +# 如果想使用iSulad + k8s,则可以在上面命令最后添加 --cri-socket=/var/run/isulad.sock +# 默认k8s组件镜像是gcr.k8s.io,可以使用--image-repository=xxx 来使用自定义镜像仓库地址(测试自己的k8s镜像) + +# 注意这里的pod-network-cidr网段不能和宿主机的网段重复,否则网络不通 +# 如果配置HA master,那么就需要一台机器init,然后剩余master kubeadm join +# 如果配置LB的话,需要在init的时候就添加--control-plane-endpoint "LB_DNS:LB_PORT" +# 上传证书--upload-certs +# 先init再配置网络 +Your Kubernetes control-plane has initialized successfully! + +To start using your cluster, you need to run the following as a regular user: + + mkdir -p $HOME/.kube + sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config + sudo chown $(id -u):$(id -g) $HOME/.kube/config + +You should now deploy a pod network to the cluster. +Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: + https://kubernetes.io/docs/concepts/cluster-administration/addons/ + +Then you can join any number of worker nodes by running the following on each as root: +... + +# 根据提示执行 +mkdir -p $HOME/.kube +cp -i /etc/kubernetes/admin.conf $HOME/.kube/config +chown $(id -u):$(id -g) $HOME/.kube/config +# 这个命令复制了admin.conf(kubeadm帮我们自动初始化好的kubectl配置文件) +# 这里包含了认证信息等相关信息的非常重要的一些配置。 + +# 重置(如果init出现问题可以重置) +kubeadm reset 重置 +# 如果出现 Unable to read config path "/etc/kubernetes/manifests" +mkdir -p /etc/kubernetes/manifests + +# 配置calico网络插件 +kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml +# 查看节点及状态 +kubectl get nodes +# 此时为Ready状态 +$ kubectl get node +NAME STATUS ROLES AGE VERSION +master Ready control-plane,master 6d16h v1.20.2 +``` + +### node加入集群 + +```bash +# 获取加入集群的口令 +# master节点上执行并复制结果 +kubeadm token create --print-join-command + +# 获取到口令之后,在三个node节点分别执行刚才的得到的结果 +kubeadm join 192.168.100.101:6443 --token 3ir18d.24rci52l2cnpwtsm --discovery-token-ca-cert-hash sha256:ce0601d14a81547447fb3a17c3631d245f32aa0f12d97cb09429845f4fed064a + +# 回到master节点,可以查看集群信息 +$ kubectl get node +NAME STATUS ROLES AGE VERSION +master Ready control-plane,master 6d16h v1.20.2 +worker1 Ready 6d22h v1.20.2 +worker2 Ready 6d16h v1.20.2 +worker3 Ready 6d21h v1.20.2 + +# 查看集群信息 +$ kubectl cluster-info +Kubernetes control plane is running at https://192.168.100.101:6443 +KubeDNS is running at https://192.168.100.101:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy + +To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. + +``` + +## k8s ETE测试 + +kubernetes 的e2e测试: + +1. 实现测试套件,需要利用基于Ginkgo/Gomega的E2E Framework, 以及client-go +2. 利用kubetest创建并启动一个测试集群,或者使用现有集群 +3. 在测试集群中运行E2E测试套,使用kubetest、go test ginkgo命令均可,本文使用kubetest,默认连接到/root/.kube/config或者设定环境变量:export KUBECONFIG=/etc/kubernetes/admin.conf +4. **本地集群数量推荐:1 master、2 node(最少)** +5. kubetest执行机器为master + +### 安装kubetest + +```bash +# 开启go mod +export GO111MODULE=on +export GONOSUMDB=on +go get -u -v k8s.io/test-infra/kubetest + +# 如果 go mod下载依赖包失败,尝试如下方法 +mkdir -p $GOPATH/src/k8s.io +git clone https://github.com/kubernetes/test-infra.git +# 生成$GOPATH/bin/kubetest二进制 +go install k8s.io/test-infra/kubetest +# 如果出错: +# [root@master1 kubernetes]# go install k8s.io/test-infra/kubetest +# go: extracting cloud.google.com/go v0.38.0 +# go: extracting cloud.google.com/go/storage v1.12.0 +# build k8s.io/test-infra/kubetest: cannot load cloud.google.com/go/storage: ambiguous import: found cloud.google.com/go/storage in multiple modules: +# cloud.google.com/go v0.66.0 (/home/GOWORK/pkg/mod/cloud.google.com/go@v0.38.0/storage) +# cloud.google.com/go/storage v1.12.0 (/home/GOWORK/pkg/mod/cloud.google.com/go/storage@v1.12.0) +# 解决: +go mod tidy +``` + +### kubetest测试 + +测试前,先构建一下kubernetes的ete框架, 确保编译通过: + +```bash +cd $GOPATH/src/k8s.io/kubernetes +go install ./test/e2e +``` + +构建kubernetes、启动一个集群、运行测试、清理,依次使用如下命令完成,需在kubernetes仓库根目录下执行: + +kubetest --build --up --test --down + +可仅执行其中一部分: + +```bash +# 构建,编译生成相关二进制文件如kubectl kubelet kubeadm ... +kubetest --build + +ls _output/local/bin/linux/arm64/ +apiextensions-apiserver conversion-gen defaulter-gen e2e.test genkubedocs genswaggertypedocs ginkgo go-bindata kubeadm kube-controller-manager kubelet kube-proxy linkcheck openapi-gen +_artifacts deepcopy-gen e2e_node.test gendocs genman genyaml go2make go-runner kube-apiserver kubectl kubemark kube-scheduler mounter + +# 执行一致性测试(conformance test) +export KUBECONFIG=$HOME/admin.conf +export KUBERNETES_CONFORMANCE_TEST=true +kubetest --test --test_args="--kubeconfig=/root/.kube/config kubetest" --test_args="--ginkgo.focus=\[Conformance\]" --provider=local --dump /home/kubelogs --timeout 2h + +# 执行本地local已有k8s单节点测试 +kubetest --test --test_args="--host=https://$本机IP:6443 --kubeconfig=/root/.kube/config kubetest" --provider=local --timeout 2h + +# 跳过指定的测试 +kubetest --test --test_args="--ginkgo.skip=Pods.*env" + +# 指定云提供商 +kubetest --provider=aws --build --up --test --down + +# 针对临时集群调用kubectl +kubetest -ctl='get events' +kubetest -ctl='delete pod foobar' + +# 清理 +kubetest --down +``` + +### sonobuoy测试 + +```bash +# 使用sonobuoy进行测试 +# 安装二进制 x86 +wget --no-check-certificate https://github.com/vmware-tanzu/sonobuoy/releases/download/v0.20.0/sonobuoy_0.20.0_linux_amd64.tar.gz +# 安装二进制 arm +wget --no-check-certificate https://github.com/vmware-tanzu/sonobuoy/releases/download/v0.20.0/sonobuoy_0.20.0_linux_arm64.tar.gz +# 下载必要镜像 +sonobuoy images pull +# 运行测试 +sonobuoy run +# 查看测试状态 +sonobuoy status +# 获取日志 +sonobuoy logs +# 保存结果 +sonobuoy retrieve +# 分析结果 +sonobuoy results xxx.tar.gz # 这个xxx.tar.gz是retrieve输出的结果 +# 清除测试 +sonobuoy delete --all # 不加--all不会删除namespace +# 如果运行run的时候出错,多半是没有delete干净,比如ns,可以查看下是否有它的ns +kubectl get ns | grep sonobuoy # 如果有,可以使用上面的sonobuoy delete --all或者kubectl delete ns sonobuoy +``` + +### 错误 + +4. FAIL: We need at least two pods to be created butall nodes are already heavily utilized, so preemption tests cannot be run + + 增加node节点,最少2个 + + 重新运行用例 + + ```bash + kubetest --test --test_args="--kubeconfig=/root/.kube/config kubetest" --test_args="--ginkgo.focus=SchedulerPreemption" --provider=local --dump /home/kubelogs + ``` + +5. should provide DNS for pods for Subdomain [Conformance] [It] + + 网络问题,建议在公网环境测试 + +6. should be able to deny custom resource creation, update and deletion [Conformance] [It] + + 未知 + +7. e2e test failed with AdmissionWebhook + change network plugin from flannel to calico, the test passed! + + 使用calico代替flannel插件 + + > https://github.com/vmware-tanzu/sonobuoy/issues/1084 + +8. should provide DNS for pods for Subdomain + + Unable to read wheezy_udp@dns-test-service from pod + + > https://github.com/kubernetes/kubernetes/issues/72985 + > + > http://3ms.huawei.com/km/blogs/details/5715567#preview_attachment_box_5715567 + > + > http://3ms.huawei.com/km/blogs/details/5158985 + +> 更多错误查询可参考: +> +> [Verify Your Kubernetes Clusters with Upstream e2e Tests](https://events19.linuxfoundation.org/wp-content/uploads/2017/11/Verify-Your-Kubernetes-Clusters-with-Upstream-e2e-Tests-Kenichi-Omichi-NEC.pdf) + +### 清理 + +如果使用本地集群进行反复测试,需周期性手动清理: + +```bash +rm -rf /var/run/kubernetes 删除k8s生成的凭证文件 +iptables -F 清空kube-proxy 生成的iptables规则 +``` diff --git "a/docs/2-\347\224\250\346\210\267\346\214\207\345\215\227/.gitkeep" "b/docs/2-\347\224\250\346\210\267\346\214\207\345\215\227/.gitkeep" new file mode 100644 index 0000000..e69de29 diff --git "a/docs/2-\347\224\250\346\210\267\346\214\207\345\215\227/k8s\344\272\214\350\277\233\345\210\266\351\203\250\347\275\262\346\214\207\345\215\227.md" "b/docs/2-\347\224\250\346\210\267\346\214\207\345\215\227/k8s\344\272\214\350\277\233\345\210\266\351\203\250\347\275\262\346\214\207\345\215\227.md" new file mode 100644 index 0000000..4ad24f2 --- /dev/null +++ "b/docs/2-\347\224\250\346\210\267\346\214\207\345\215\227/k8s\344\272\214\350\277\233\345\210\266\351\203\250\347\275\262\346\214\207\345\215\227.md" @@ -0,0 +1,1528 @@ +# openEuler二进制部署K8S + +* [集群状态](#集群状态) +* [准备虚拟机](#准备虚拟机) + * [安装依赖工具](#安装依赖工具) + * [准备虚拟机磁盘文件](#准备虚拟机磁盘文件) + * [打开 VNC 防火墙端口](#打开-vnc-防火墙端口) + * [准备虚拟机配置文件](#准备虚拟机配置文件) + * [安装虚拟机](#安装虚拟机) +* [部署 Kubernetes 集群](#部署--kubernetes-集群) + * [环境说明](#环境说明) + * [安装 Kubernetes 软件包](#安装-kubernetes-软件包) + * [准备证书](#准备证书) + * [编译安装 CFSSL](#编译安装-cfssl) + * [生成根证书](#生成根证书) + * [生成 admin 账户证书](#生成-admin-账户证书) + * [生成 service-account 账户证书](#生成-service-account-账户证书) + * [生成 kube-controller-manager 组件证书](#生成-kube-controller-manager-组件证书) + * [生成 kube-proxy 证书](#生成-kube-proxy-证书) + * [生成 kube-scheduler 证书](#生成-kube-scheduler-证书) + * [生成 kubelet 证书](#生成-kubelet-证书) + * [生成 kube-apiserver 证书](#生成-kube-apiserver-证书) + * [生成 etcd 证书(可选)](#生成-etcd-证书可选) + * [安装 etcd](#安装-etcd) + * [准备环境](#准备环境) + * [安装 etcd 二进制](#安装-etcd-二进制) + * [编写 etcd.service 文件](#编写-etcdservice-文件) + * [验证基本功能](#验证基本功能) +* [部署控制面组件](#部署控制面组件) + * [准备所有组件的 kubeconfig](#准备所有组件的-kubeconfig) + * [kube-proxy](#kube-proxy) + * [kube-controller-manager](#kube-controller-manager) + * [kube-scheduler](#kube-scheduler) + * [admin](#admin) + * [获得相关 kubeconfig 配置文件](#获得相关-kubeconfig-配置文件) + * [生成密钥提供者的配置](#生成密钥提供者的配置) + * [拷贝证书](#拷贝证书) + * [部署 admin 角色的 RBAC](#部署-admin-角色的-rbac) + * [部署 api server 服务](#部署-api-server-服务) + * [编写 apiserver 的 systemd 配置](#编写-apiserver-的-systemd-配置) + * [部署 controller-manager 服务](#部署-controller-manager-服务) + * [编写 controller-manager 的 systemd 配置文件](#编写-controller-manager-的-systemd-配置文件) + * [部署 scheduler 服务](#部署-scheduler-服务) + * [编写 scheduler 的 systemd 配置文件](#编写-scheduler-的-systemd-配置文件) + * [使能各组件](#使能各组件) + * [基本功能验证](#基本功能验证) +* [部署 Node 节点组件](#部署-node-节点组件) + * [环境准备](#环境准备) + * [创建 kubeconfig 配置文件](#创建-kubeconfig-配置文件) + * [拷贝证书](#拷贝证书-1) + * [CNI 网络配置](#cni-网络配置) + * [部署 kubelet 服务](#部署-kubelet-服务) + * [kubelet 依赖的配置文件](#kubelet-依赖的配置文件) + * [编写 systemd 配置文件](#编写-systemd-配置文件) + * [部署 kube-proxy](#部署-kube-proxy) + * [kube-proxy 依赖的配置文件](#kube-proxy-依赖的配置文件) + * [编写 systemd 配置文件](#编写-systemd-配置文件-1) + * [启动组件服务](#启动组件服务) + * [验证集群状态](#验证集群状态) + * [部署 coredns](#部署-coredns) + * [编写 coredns 配置文件](#编写-coredns-配置文件) + * [准备 systemd 的 service 文件](#准备-systemd-的-service-文件) + * [启动服务](#启动服务) + * [创建 coredns 的 Service 对象](#创建-coredns-的-service-对象) + * [创建 coredns 的 endpoint 对象](#创建-coredns-的-endpoint-对象) + * [确认 coredns 服务](#确认-coredns-服务) +* [运行测试 pod](#运行测试-pod) + * [配置文件](#配置文件) + * [启动 pod](#启动-pod) + +**声明:本文档仅适用于实验和学习环境,不适用于商用环境** + +本文档介绍在 openEuler 操作系统上,通过二进制部署 K8S 集群的一个参考方法。 + +说明:本文所有操作均使用 `root`权限执行。 + +## 集群状态 + +本文所使用的集群状态如下: + +- 集群结构:6 个 `openEuler 21.03`系统的虚拟机,3 个 master 和 3 个 node 节点 +- 物理机:`openEuler 21.03 `的 `x86/ARM`服务器 + +## 准备虚拟机 + + +本章介绍使用 virt manager 安装虚拟机的方法,如果您已经准备好虚拟机,可以跳过本章节。 + +### 安装依赖工具 + +安装虚拟机,会依赖相关工具,安装依赖并使能 libvirtd 服务的参考命令如下(如果需要代理,请先配置代理): + +```bash +$ dnf install virt-install virt-manager libvirt-daemon-qemu edk2-aarch64.noarch virt-viewer +$ systemctl start libvirtd +$ systemctl enable libvirtd +``` + +### 准备虚拟机磁盘文件 + +```bash +$ dnf install -y qemu-img +$ virsh pool-define-as vmPool --type dir --target /mnt/vm/images/ +$ virsh pool-build vmPool +$ virsh pool-start vmPool +$ virsh pool-autostart vmPool +$ virsh vol-create-as --pool vmPool --name master0.img --capacity 200G --allocation 1G --format qcow2 +$ virsh vol-create-as --pool vmPool --name master1.img --capacity 200G --allocation 1G --format qcow2 +$ virsh vol-create-as --pool vmPool --name master2.img --capacity 200G --allocation 1G --format qcow2 +$ virsh vol-create-as --pool vmPool --name node1.img --capacity 300G --allocation 1G --format qcow2 +$ virsh vol-create-as --pool vmPool --name node2.img --capacity 300G --allocation 1G --format qcow2 +$ virsh vol-create-as --pool vmPool --name node3.img --capacity 300G --allocation 1G --format qcow2 +``` + +### 打开 VNC 防火墙端口 + +**方法一** + +1. 查询端口 + + ```shell + $ netstat -lntup | grep qemu-kvm + ``` + +2. 打开 VNC 的防火墙端口。假设端口从 5900 开始,参考命令如下: + + ```shell + $ firewall-cmd --zone=public --add-port=5900/tcp + $ firewall-cmd --zone=public --add-port=5901/tcp + $ firewall-cmd --zone=public --add-port=5902/tcp + $ firewall-cmd --zone=public --add-port=5903/tcp + $ firewall-cmd --zone=public --add-port=5904/tcp + $ firewall-cmd --zone=public --add-port=5905/tcp + ``` + + + +**方法二** + +直接关闭防火墙 + +```shell +$ systemctl stop firewalld +``` + + +### 准备虚拟机配置文件 + +创建虚拟机需要虚拟机配置文件。假设配置文件为 master.xml ,以虚拟机 hostname 为 k8smaster0 的节点为例,参考配置如下: + +```bash + cat master.xml + + + k8smaster0 + 8 + 8 + + hvm + /usr/share/edk2/aarch64/QEMU_EFI-pflash.raw + /var/lib/libvirt/qemu/nvram/k8smaster0.fd + + + + + + + + + 1 + + destroy + restart + restart + + /usr/libexec/qemu-kvm + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +由于虚拟机相关配置必须唯一,新增虚拟机需要适配修改如下内容,保证虚拟机的唯一性: + +- name:虚拟机 hostname,建议尽量小写。例中为 `k8smaster0` +- nvram:nvram的句柄文件路径,需要全局唯一。例中为 `/var/lib/libvirt/qemu/nvram/k8smaster0.fd` +- disk 的 source file:虚拟机磁盘文件路径。例中为 `/mnt/vm/images/master0.img` +- interface 的 mac address:interface 的 mac 地址。例中为 `52:54:00:00:00:80` + + +### 安装虚拟机 + +1. 创建并启动虚拟机 + + ```shell + $ virsh define master.xml + $ virsh start k8smaster0 + ``` + +2. 获取虚拟机的 VNC 端口号 + + ```shell + $ virsh vncdisplay k8smaster0 + ``` + +3. 使用虚拟机链接工具,例如 VNC Viewer 远程链接虚拟机,并根据提示依次选择配置,完成系统安装 + +4. 设置虚拟机 hostname,例如设置为 k8smaster0 + + ```shell + $ hostnamectl set-hostname k8smaster0 + ``` + +## 部署 Kubernetes 集群 + + +本章介绍部署 Kubernets 集群的方法。 + +### 环境说明 + +通过上述虚拟机安装部署,获得如下虚拟机列表: + +| HostName | MAC | IPv4 | +| ---------- | ----------------- | ------------------ | +| k8smaster0 | 52:54:00:00:00:80 | 192.168.122.154/24 | +| k8smaster1 | 52:54:00:00:00:81 | 192.168.122.155/24 | +| k8smaster2 | 52:54:00:00:00:82 | 192.168.122.156/24 | +| k8snode1 | 52:54:00:00:00:83 | 192.168.122.157/24 | +| k8snode2 | 52:54:00:00:00:84 | 192.168.122.158/24 | +| k8snode3 | 52:54:00:00:00:85 | 192.168.122.159/24 | + + +### 安装 Kubernetes 软件包 + + +```bash +$ dnf install -y docker conntrack-tools socat +``` + +EPOL 之后,可以直接通过 dnf 安装 K8S + +```bash +$ rpm -ivh kubernetes*.rpm +``` + + +### 准备证书 + + +**声明:本文使用的证书为自签名,不能用于商用环境** + +部署集群前,需要生成集群各组件之间通信所需的证书。本文使用开源 CFSSL 作为验证部署工具,以便用户了解证书的配置和集群组件之间证书的关联关系。用户可以根据实际情况选择合适的工具,例如 OpenSSL 。 + +#### 编译安装 CFSSL + +编译安装 CFSSL 的参考命令如下(需要互联网下载权限,需要配置代理的请先完成配置), + +```bash +$ wget --no-check-certificate https://github.com/cloudflare/cfssl/archive/v1.5.0.tar.gz +$ tar -zxf v1.5.0.tar.gz +$ cd cfssl-1.5.0/ +$ make -j6 +$ cp bin/* /usr/local/bin/ +``` + +#### 生成根证书 + +编写 CA 配置文件,例如 ca-config.json: + +```bash +$ cat ca-config.json | jq +{ + "signing": { + "default": { + "expiry": "8760h" + }, + "profiles": { + "kubernetes": { + "usages": [ + "signing", + "key encipherment", + "server auth", + "client auth" + ], + "expiry": "8760h" + } + } + } +} +``` + +编写 CA CSR 文件,例如 ca-csr.json: + +```bash +$ cat ca-csr.json | jq +{ + "CN": "Kubernetes", + "key": { + "algo": "rsa", + "size": 2048 + }, + "names": [ + { + "C": "CN", + "L": "HangZhou", + "O": "openEuler", + "OU": "WWW", + "ST": "BinJiang" + } + ] +} +``` + +生成 CA 证书和密钥: +```bash +$ cfssl gencert -initca ca-csr.json | cfssljson -bare ca +``` + +得到如下证书: + +```bash +ca.csr ca-key.pem ca.pem +``` + +#### 生成 admin 账户证书 + +admin 是 K8S 用于系统管理的一个账户,编写 admin 账户的 CSR 配置,例如 admin-csr.json: +```bash +cat admin-csr.json | jq +{ + "CN": "admin", + "key": { + "algo": "rsa", + "size": 2048 + }, + "names": [ + { + "C": "CN", + "L": "HangZhou", + "O": "system:masters", + "OU": "Containerum", + "ST": "BinJiang" + } + ] +} +``` + +生成证书: +```bash +$ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin +``` + +结果如下: +```bash +admin.csr admin-key.pem admin.pem +``` + +#### 生成 service-account 账户证书 + +编写 service-account 账户的 CSR 配置文件,例如 service-account-csr.json: +```bash +cat service-account-csr.json | jq +{ + "CN": "service-accounts", + "key": { + "algo": "rsa", + "size": 2048 + }, + "names": [ + { + "C": "CN", + "L": "HangZhou", + "O": "Kubernetes", + "OU": "openEuler k8s install", + "ST": "BinJiang" + } + ] +} +``` + +生成证书: +```bash +$ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes service-account-csr.json | cfssljson -bare service-account +``` + +结果如下: +```bash +service-account.csr service-account-key.pem service-account.pem +``` + +#### 生成 kube-controller-manager 组件证书 + +编写 kube-controller-manager 的 CSR 配置: +```bash +{ + "CN": "system:kube-controller-manager", + "key": { + "algo": "rsa", + "size": 2048 + }, + "names": [ + { + "C": "CN", + "L": "HangZhou", + "O": "system:kube-controller-manager", + "OU": "openEuler k8s kcm", + "ST": "BinJiang" + } + ] +} +``` + +生成证书: +```bash +$ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager +``` + +结果如下: +```bash +kube-controller-manager.csr kube-controller-manager-key.pem kube-controller-manager.pem +``` + +#### 生成 kube-proxy 证书 + +编写 kube-proxy 的 CSR 配置: +```bash +{ + "CN": "system:kube-proxy", + "key": { + "algo": "rsa", + "size": 2048 + }, + "names": [ + { + "C": "CN", + "L": "HangZhou", + "O": "system:node-proxier", + "OU": "openEuler k8s kube proxy", + "ST": "BinJiang" + } + ] +} +``` + +生成证书: +```bash +$ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy +``` + +结果如下: +```bash +kube-proxy.csr kube-proxy-key.pem kube-proxy.pem +``` + +#### 生成 kube-scheduler 证书 + +编写 kube-scheduler 的 CSR 配置: +```bash +{ + "CN": "system:kube-scheduler", + "key": { + "algo": "rsa", + "size": 2048 + }, + "names": [ + { + "C": "CN", + "L": "HangZhou", + "O": "system:kube-scheduler", + "OU": "openEuler k8s kube scheduler", + "ST": "BinJiang" + } + ] +} +``` + +生成证书: +```bash +$ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-scheduler-csr.json | cfssljson -bare kube-scheduler +``` + +结果如下: +```bash +kube-scheduler.csr kube-scheduler-key.pem kube-scheduler.pem +``` + +#### 生成 kubelet 证书 + +由于证书涉及到 kubelet 所在机器的 hostname 和 IP 地址信息,因此每个 node 节点配置不尽相同,所以编写脚本完成,生成脚本如下: +```bash +$ cat node_csr_gen.bash + +#!/bin/bash + +nodes=(k8snode1 k8snode2 k8snode3) +IPs=("192.168.122.157" "192.168.122.158" "192.168.122.159") + +for i in "${!nodes[@]}"; do + +cat > "${nodes[$i]}-csr.json" < encryption-config.yaml < 17h v1.20.2 +k8snode2 Ready 19m v1.20.2 +k8snode3 Ready 12m v1.20.2 +``` + +### 部署 coredns + +coredns可以部署到node节点或者master节点,本文这里部署到节点`k8snode1`。 + +#### 编写 coredns 配置文件 + +```bash +$ cat /etc/kubernetes/pki/dns/Corefile +.:53 { + errors + health { + lameduck 5s + } + ready + kubernetes cluster.local in-addr.arpa ip6.arpa { + pods insecure + endpoint https://192.168.122.154:6443 + tls /etc/kubernetes/pki/ca.pem /etc/kubernetes/pki/admin-key.pem /etc/kubernetes/pki/admin.pem + kubeconfig /etc/kubernetes/pki/admin.kubeconfig default + fallthrough in-addr.arpa ip6.arpa + } + prometheus :9153 + forward . /etc/resolv.conf { + max_concurrent 1000 + } + cache 30 + loop + reload + loadbalance +} +``` + +说明: + +- 监听53端口; +- 设置kubernetes插件配置:证书、kube api的URL; + +#### 准备 systemd 的 service 文件 + +```bash +cat /usr/lib/systemd/system/coredns.service +[Unit] +Description=Kubernetes Core DNS server +Documentation=https://github.com/coredns/coredns +After=network.target + +[Service] +ExecStart=bash -c "KUBE_DNS_SERVICE_HOST=10.32.0.10 coredns -conf /etc/kubernetes/pki/dns/Corefile" + +Restart=on-failure +LimitNOFILE=65536 + +[Install] +WantedBy=multi-user.target +``` + +#### 启动服务 + +```bash +$ systemctl enable coredns +$ systemctl start coredns +``` + +#### 创建 coredns 的 Service 对象 + +```bash +$ cat coredns_server.yaml +apiVersion: v1 +kind: Service +metadata: + name: kube-dns + namespace: kube-system + annotations: + prometheus.io/port: "9153" + prometheus.io/scrape: "true" + labels: + k8s-app: kube-dns + kubernetes.io/cluster-service: "true" + kubernetes.io/name: "CoreDNS" +spec: + clusterIP: 10.32.0.10 + ports: + - name: dns + port: 53 + protocol: UDP + - name: dns-tcp + port: 53 + protocol: TCP + - name: metrics + port: 9153 + protocol: TCP +``` + +#### 创建 coredns 的 endpoint 对象 + +```bash +$ cat coredns_ep.yaml +apiVersion: v1 +kind: Endpoints +metadata: + name: kube-dns + namespace: kube-system +subsets: + - addresses: + - ip: 192.168.122.157 + ports: + - name: dns-tcp + port: 53 + protocol: TCP + - name: dns + port: 53 + protocol: UDP + - name: metrics + port: 9153 + protocol: TCP +``` + +#### 确认 coredns 服务 + +```bash +# 查看service对象 +$ kubectl get service -n kube-system kube-dns +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +kube-dns ClusterIP 10.32.0.10 53/UDP,53/TCP,9153/TCP 51m +# 查看endpoint对象 +$ kubectl get endpoints -n kube-system kube-dns +NAME ENDPOINTS AGE +kube-dns 192.168.122.157:53,192.168.122.157:53,192.168.122.157:9153 52m +``` + +## 运行测试 pod + + +### 配置文件 + +```bash +$ cat nginx.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx-deployment + labels: + app: nginx +spec: + replicas: 3 + selector: + matchLabels: + app: nginx + template: + metadata: + labels: + app: nginx + spec: + containers: + - name: nginx + image: nginx:1.14.2 + ports: + - containerPort: 80 +``` + +### 启动 pod + +通过kubectl命令运行nginx。 + +```bash +$ kubectl apply -f nginx.yaml +deployment.apps/nginx-deployment created +$ kubectl get pods +NAME READY STATUS RESTARTS AGE +nginx-deployment-66b6c48dd5-6rnwz 1/1 Running 0 33s +nginx-deployment-66b6c48dd5-9pq49 1/1 Running 0 33s +nginx-deployment-66b6c48dd5-lvmng 1/1 Running 0 34s +``` diff --git "a/docs/2-\347\224\250\346\210\267\346\214\207\345\215\227/k8s\351\225\234\345\203\217\345\217\221\345\270\203\346\265\201\347\250\213\346\232\202\350\241\214\345\212\236\346\263\225.md" "b/docs/2-\347\224\250\346\210\267\346\214\207\345\215\227/k8s\351\225\234\345\203\217\345\217\221\345\270\203\346\265\201\347\250\213\346\232\202\350\241\214\345\212\236\346\263\225.md" new file mode 100644 index 0000000..341426a --- /dev/null +++ "b/docs/2-\347\224\250\346\210\267\346\214\207\345\215\227/k8s\351\225\234\345\203\217\345\217\221\345\270\203\346\265\201\347\250\213\346\232\202\350\241\214\345\212\236\346\263\225.md" @@ -0,0 +1,13 @@ +# k8s镜像发布流程暂行办法 + +## 背景 + +openEuler中尚不存在k8s组件容器镜像,为了保证一致性以及可溯源,需要提供**基于openEuler**的k8s组件容器镜像。 + +受限于openEuler发布流程,开发者需要一个快速迭代、自主可控的镜像发布地址以供开发、调试。 + +## 阶段性解决方案 + +鉴于以上多种问题以及交付流程约束,CloudNative SIG 制定了以下暂行办法: + +k8s组件容器镜像由openEuler基础镜像为base进行打包制作,并推送到`hub.oepkgs.net`中的个人仓用作开源爱好者、开发者进行k8s集群的构建以及调试,**暂不进入 openEuler release 版本**。未来组件正式发布之后会在此发布,期间有新的组件镜像加入也会[在此发布](https://hub.oepkgs.net/)。 diff --git "a/docs/3-\347\211\271\346\200\247\346\214\207\345\215\227/.gitkeep" "b/docs/3-\347\211\271\346\200\247\346\214\207\345\215\227/.gitkeep" new file mode 100644 index 0000000..e69de29 diff --git "a/docs/4-\345\205\266\344\273\226/.gitkeep" "b/docs/4-\345\205\266\344\273\226/.gitkeep" new file mode 100644 index 0000000..e69de29 diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..314e3fe --- /dev/null +++ b/docs/README.md @@ -0,0 +1,15 @@ +# CloudNative SIG WiKi + +此处存放CloudNative云原生相关资料供开发者、用户参考 + +## 目录说明 +- **1-开发指南**:存放开发者关注的文档,如k8s集群本地测试调试方法等 + - [k8s集群本地测试调试方法](1-开发指南/k8s集群本地测试调试方法.md) +- **2-用户指南**:存放用户指南,如k8s集群二进制部署方法、SIG组件版本关系配套说明等,更多的是基于场景的解决方案类 + - [k8s镜像发布流程暂行办法](2-用户指南/k8s镜像发布流程暂行办法.md) + - [k8s二进制部署指南](2-用户指南/k8s二进制部署指南.md) +- **3-特性指南**:SIG组内特性维度的文档,包括但不限于设计、架构等 +- **4-其他**:不属于上述三类的文档 + +## 说明 +开发者在提交文档之后,请更新此文件,刷新相关目录章节 -- Gitee