关于go:100元实践k8s搭建过程

33次阅读

共计 9727 个字符,预计需要花费 25 分钟才能阅读完成。

前言

工作中越来越重度应用 k8s,想进一步理解 k8s 的工作原理。一方面学习业界优良零碎设计思路,另一方面多理解也能够进步日常工作效率,比方和 k8s 开发的沟通效率等。明天第一步:本人着手搭建一个 k8s 服务。

本文采纳的版本

kubectl kubelet kubeadm 版本: 1.23.1
操作系统版本: CentOS 8.2 64 位

筹备工作

1. 洽购云主机

官网倡议最低云主机配置 2 核 4G,国内任意云厂商洽购就行,作为 K8S 服务的宿主机。 本教程操作系统为 CentOS 8.2 64 位

备注:官网文档标记最低配置内存要求 2G,然而装置完 dashboard、ingress 等服务之后比拟卡顿,所以为了晦涩这里举荐 4G 内存。

<p align=”center”>
<img src=”https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e513dc1d52314ef9a89fa15791ef2b38~tplv-k3u1fbpfcp-zoom-1.image” style=”width:90%”>
</p>

2. 放开端口

外网放开 30000 端口,后续浏览器登陆 k8s dashboard 看板应用。并查看 ssh 服务端口 22 是否失常开启。

<p align=”center”>
<img src=”https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bb09fa2abfbf4e949a1ebea84c25ee2b~tplv-k3u1fbpfcp-zoom-1.image” style=”width:90%”>
</p>

应用 ssh 登陆云主机,开始配置。

3. 装置工具

装置常用工具:

yum install -y yum-utils device-mapper-persistent-data lvm2 iproute-tc

4. 增加阿里源

国内存在墙的问题,增加阿里源减速:

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

开始装置

1. 装置社区版本 docker

装置:

yum -y install docker-ce

enable:

systemctl enable docker

查看 docker 版本docker version
<p align=”center”>
<img src=”https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8ddf996f4f124168a07d424a4fb80cd3~tplv-k3u1fbpfcp-zoom-1.image” style=”width:60%”>
</p>

2. 装置 kubectl kubelet kubeadm

2.1 增加阿里源
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

留神点:v1.24 版本后 kubernetes 放弃 docker,装置过程存在一些问题,这里咱们指定 1.23.1 版本装置

2.2 装置 1.23.1 版本 kubectl kubelet kubeadm:
yum install -y kubectl-1.23.1 kubelet-1.23.1 kubeadm-1.23.1

启动 kubelet:

systemctl enable kubelet

查看 kubectl 版本:
<p align=”center”>
<img src=”https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5b9d4ca77a4047aea320cbd0989fa063~tplv-k3u1fbpfcp-zoom-1.image” style=”width:90%”>
</p>

2.3 批改cgroupdriver

执行如下命令:

cat <<EOF > /etc/docker/daemon.json
{"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

重启服务:

systemctl daemon-reload
systemctl restart docker
systemctl restart kubelet
2.4 替换镜像源

因为这里咱们应用的是国内的云厂商,拜访海内 k8s.gcr.io 拉取镜像存在墙的问题,所以上面咱们就替换成 registry.cn-hangzhou.aliyuncs.com/google_containers 的地址,具体操作如下:

删除旧配置文件:

rm -f /etc/containerd/config.toml

生产默认配置文件:

containerd config default > /etc/containerd/config.toml

替换镜像地址:

sed -i 's/k8s.gcr.io/registry.cn-hangzhou.aliyuncs.com\/google_containers/' /etc/containerd/config.toml

重启containerd

systemctl restart containerd
2.4 初始化 k8s master 节点

初始化命令:

kubeadm init --kubernetes-version=1.23.1  \
--apiserver-advertise-address=< 你的云主机内网 IP>   \
--image-repository registry.aliyuncs.com/google_containers  \
--service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16

通常会卡在这一步,如果大家依照本文的版本,实践不会报错,如果报错须要一一搜寻解决了。
<p align=”center”>
<img src=”https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2b8afe070bda4bf5ba0a5885bec57504~tplv-k3u1fbpfcp-zoom-1.image” style=”width:60%”>
</p>

如果初始化失败,执行如下命令后再从新初始化:

kubeadm reset -f

初始化胜利之后失去如下命令,退出新的 node 节点应用(本次不应用):

kubeadm join < 你的云主机内网 IP>:6443 --token 78376v.rznvls130w3sgwb7 \
    --discovery-token-ca-cert-hash sha256:add03fb7de52ad73fd96626fa9d9f0d639186524ba34d24742c15fce8093b8c5

配置kubectl

mkdir -p $HOME/.kube

cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

chown $(id -u):$(id -g) $HOME/.kube/config

查看 k8s 服务启动状态:

kubectl get pod --all-namespaces

<p align=”center”>
<img src=”https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/16174ee7fa614ef58060c24fc701e5e6~tplv-k3u1fbpfcp-zoom-1.image” style=”width:90%”>
</p>

3. 装置 calico 网络

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/custom-resources.yaml

装置结束后,查看 calico 服务启动状态:

kubectl get pod --all-namespaces

<p align=”center”>
<img src=”https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1d0549f21a3c44c1a19f4491e7f8e453~tplv-k3u1fbpfcp-zoom-1.image” style=”width:90%”>
</p>

4. 装置 kubernates-dashboard

4.1 下载配置文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc7/aio/deploy/recommended.yaml
4.2 增加 nodeport

配置 nodeport,外网拜访 dashboard:

<p align=”center”>
<img src=”https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6ff847d0ac0f43cb9a0972d88fb4281b~tplv-k3u1fbpfcp-zoom-1.image” style=”width:50%”>
</p>

4.3 创立 dashboard 服务

创立:

kubectl apply -f recommended.yaml

查看 kubernetes-dashboard 启动状态:

kubectl get pod -n kubernetes-dashboard

<p align=”center”>
<img src=”https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/dad68e94f9844a1d83143fa596a84a76~tplv-k3u1fbpfcp-zoom-1.image” style=”width:90%”>
</p>

4.4 外网拜访 dashboard

浏览器关上 dashboard,地址:< 你的外网 IP:30000>

<p align=”center”>
<img src=”https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ac84d1fea51e41cab64f4722c161472d~tplv-k3u1fbpfcp-zoom-1.image” style=”width:90%”>
</p>

如上图所示,因为 https 的问题,浏览器会提醒「您的连贯不是私密连贯」。举荐应用 chrome 浏览器,并在当前页面上任意地位点击,而后键盘输入「thisisunsafe」再点击回车健即可。

<p align=”center”>
<img src=”https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/84d33d34138f4abf9cd3545ebcff4945~tplv-k3u1fbpfcp-zoom-1.image” style=”width:90%”>
</p>

4.5 获取 token

创立用户。dashboard-adminuser.yaml配置文件示例,执行如下命令间接创立,参考官网教程创立示例用户 https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md

创立配置文件:

cat <<EOF > dashboard-adminuser.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
EOF

创立用户:

kubectl apply -f dashboard-adminuser.yaml

创立胜利之后提醒:

serviceaccount/admin-user created
clusterrolebinding.rbac.authorization.k8s.io/admin-user created

执行如下命令获取 token:

kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"

<p align=”center”>
<img src=”https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e989e8eaa1ba4106ad3676e5669358fe~tplv-k3u1fbpfcp-zoom-1.image” style=”width:90%”>
</p>

4.6 复制 token 登陆 dashboard

<p align=”center”>
<img src=”https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e82411aa044f44919ac9b29d5ba68fe0~tplv-k3u1fbpfcp-zoom-1.image” style=”width:90%”>
</p>

到这里咱们曾经能够失常创立 pod 了,然而外网还不能间接拜访到 pod,尽管能够采纳 dashboard 的 nodeport 的计划,然而 nodeport 只反对裸露 30000-32767 的端口,不适用于生产环境,接着咱们就通过另一种形式 ingress 来对外裸露 pod。

5. 装置 ingress

5.1 下载官网配置文件,这里应用的 v1.3.1 版本:
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.1/deploy/static/provider/cloud/deploy.yaml
5.2 同样因为墙的问题,咱们把配置文件中的镜像源换成阿里源:

替换 nginx-ingress-controller 镜像源:

sed -i 's/registry.k8s.io\/ingress-nginx\/controller:v1.3.1@sha256:54f7fe2c6c5a9db9a0ebf1131797109bb7a4d91f56b9b362bde2abd237dd1974/registry.cn-hangzhou.aliyuncs.com\/google_containers\/nginx-ingress-controller:v1.3.1/g' ./deploy.yaml

替换 kube-webhook-certgen 镜像源:

sed -i 's/registry.k8s.io\/ingress-nginx\/kube-webhook-certgen:v1.3.0@sha256:549e71a6ca248c5abd51cdb73dbc3083df62cf92ed5e6147c780e30f7e007a47/registry.cn-hangzhou.aliyuncs.com\/google_containers\/kube-webhook-certgen:v1.3.0/g' ./deploy.yaml
5.3 创立 ingress 服务

创立:

kubectl apply -f deploy.yaml

查看状态:

kubectl get pod --all-namespaces

<p align=”center”>
<img src=”https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ad3ad0710cbb4f4ca0565dcd2835fd53~tplv-k3u1fbpfcp-zoom-1.image” style=”width:90%”>
</p>

创立实现之后,查看 ingress 状态,为 pending 状态,起因是短少 LB,这里咱们应用metallb

5.4 装置 metallb

执行装置命令:

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml

<p align=”center”>
<img src=”https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3d5dbaaa247c4ccaad4b8d5d7e14769c~tplv-k3u1fbpfcp-zoom-1.image” style=”width:90%”>
</p>

创立 secret:

kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"

查看装置状态:

kubectl get ns
kubectl get all -n metallb-system
5.4 绑定外网 IP EXTERNAL-IP
kubectl get service ingress-nginx-controller --namespace=ingress-nginx

<p align=”center”>
<img src=”https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/40d19a1c17c24081a41206223f23585b~tplv-k3u1fbpfcp-zoom-1.image” style=”width:80%”>
</p>

kubectl edit service ingress-nginx-controller --namespace=ingress-nginx

增加:externalIPs:
  - 118.195.228.232

<p align=”center”>
<img src=”https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/983400a6f66941758cd07d8423de29aa~tplv-k3u1fbpfcp-zoom-1.image” style=”width:50%”>
</p>

kubectl get service ingress-nginx-controller --namespace=ingress-nginx

<p align=”center”>
<img src=”https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fbe7ce843e8141b3b8d788c437bdeb66~tplv-k3u1fbpfcp-zoom-1.image” style=”width:80%”>
</p>

查看启动状态kubectl get pod --all-namespaces
<p align=”center”>
<img src=”https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ce49b1f235314202abeba5bc22c7aa93~tplv-k3u1fbpfcp-zoom-1.image” style=”width:80%”>
</p>

metalab 和 ingress-nginx 的状态还是pending,查看起因:

kubectl describe pod ingress-nginx-controller-6bfbdbdd64-jp7lw -n ingress-nginx

<p align=”center”>
<img src=”https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e48c4af8d92948538dfc64f5e37a36af~tplv-k3u1fbpfcp-zoom-1.image” style=”width:80%”>
</p>

起因是当初只有 master 节点,还没有 node 节点,未了节省成本,这里咱们容许 master 参加调度,把 master 节点也当 node 应用。

5.5 容许 master 节点能够被调度

执行:

kubectl taint nodes --all node-role.kubernetes.io/master-

查看 pod 状态:

kubectl get pod --all-namespaces

<p align=”center”>
<img src=”https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/eeaa43cd38334e08919eb3612fce9b3a~tplv-k3u1fbpfcp-zoom-1.image” style=”width:80%”>
</p>

pod 均失常运行。到这里,一个根底的 k8s 服务根本装置实现。

体验 k8s

解析域名

你的测试域名 A 解析到服务器的外网 IP 上,具体步骤略。

创立测试服务 pod

kubectl create deployment demo --image=httpd --port=80

kubectl expose deployment demo

创立 ingress 映射

kubectl create ingress demo --class=nginx  --rule="k8s.tigerb.cn/*=demo:80"

测试

查看 ingress 服务 service 的外网端口

<p align=”center”>
<img src=”https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3b23725e5eb54f599e7d6b91f99c620c~tplv-k3u1fbpfcp-zoom-1.image” style=”width:80%”>
</p>

demopod 启动胜利后拜访 http://k8s.tigerb.cn:32374/ 测试服务即可。

<p align=”center”>
<img src=”https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a1ae0350dd3741f38a29798a452baca0~tplv-k3u1fbpfcp-zoom-1.image” style=”width:80%”>
</p>

到此为止,咱们就胜利部署了一个 k8s 服务,应用 dashborad 就能够很轻松实现服务部署、扩容、缩容等。

正文完
 0