公网部署openyurt集群并支持metrics-server和prometheus
- 删除以前的集群
- 创建虚拟网卡
- 初始化主节点
- 安装kubeadm等
- 初始化
- 安装网络插件flannel
- 根据官方文档调整
- 部署OpenYurt的Control-Plane组件
- 部署openyurt/openyurt组件
- 部署kuboard方便可视化
- 主节点改造使其可以部署metrics-server和prometheus
- 部署YurtHub
- 部署metrics-server
- 边缘节点加入
- 编译yurtadm
- 安装go环境
- 编译
- join命令
- 部署prometheus
- 某些问题解决
- 主节点初始化失败
- 无法使用kubectl logs命令
- 通用问题解决方法
删除以前的集群
最好重启一下
主节点:
kubeadm reset
rm -rf /etc/cni/net.d
rm -rf $HOME/.kube/config
rm -rf /etc/kubernetes/
reboot
从节点:
yurtadm reset
rm -rf /etc/cni/net.d
rm -rf $HOME/.kube/config
reboot
开机后记得
swapoff -a
创建虚拟网卡
因为阿里云服务器内部网卡没有对应公网ip地址,需要创建虚拟网卡
每次重启后必须重新执行
ifconfig eth0:0 [公网ip] up
初始化主节点
安装kubeadm等
参考 https://blog.csdn.net/weixin_43168190/article/details/107223600
初始化
kubeadm init --apiserver-advertise-address=[公网ip] --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.22.8 --service-cidr=10.96.0.0/12
如果出现问题看日志:
journalctl -u kubelet -xe
翻到文章最后面也会汇总一些问题。
初始化完成后
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
安装网络插件flannel
参考 https://blog.csdn.net/weixin_43168190/article/details/127774243?spm=1001.2014.3001.5501
用这篇文章里面的flannel文件和镜像。
根据官方文档调整
https://openyurt.io/zh/docs/installation/manually-setup/
kubectl label node center openyurt.io/is-edge-worker=false
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
- --controllers=-nodelifecycle,*,bootstrapsigner,tokencleaner
等待重启
cd openyurt
kubectl apply -f config/setup/yurt-tunnel-dns.yaml
kubectl -n kube-system get svc yurt-tunnel-dns
记住ClusterIP
vim /etc/kubernetes/manifests/kube-apiserver.yaml
:set paste # 设置为粘贴模式,然后插入在spec下面,缩进不要改
dnsPolicy: "None" # 1. dnsPolicy修改为None
dnsConfig: # 2. 增加dnsConfig配置
nameservers:
- 10.99.148.17 # 使用yurt-tunnel-dns service的clusterIP替换
searches:
- kube-system.svc.cluster.local
- svc.cluster.local
- cluster.local
options:
- name: ndots
value: "5"
# 3. 下面还要改
- --kubelet-preferred-address-types=Hostname,InternalIP,ExternalIP
kubectl annotate svc kube-dns -n kube-system openyurt.io/topologyKeys='openyurt.io/nodepool'
创建ds
vim coredns-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
k8s-app: kube-dns
name: coredns
namespace: kube-system
spec:
selector:
matchLabels:
k8s-app: kube-dns
template:
metadata:
labels:
k8s-app: kube-dns
spec:
containers:
- args:
- -conf
- /etc/coredns/Corefile
image: registry.aliyuncs.com/google_containers/coredns:1.9.3
livenessProbe:
failureThreshold: 5
httpGet:
path: /health
port: 8080
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
name: coredns
ports:
- containerPort: 53
name: dns
protocol: UDP
- containerPort: 53
name: dns-tcp
protocol: TCP
- containerPort: 9153
name: metrics
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /ready
port: 8181
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
resources:
limits:
memory: 170Mi
requests:
cpu: 100m
memory: 70Mi
securityContext:
allowPrivilegeEscalation: false
capabilities:
add:
- NET_BIND_SERVICE
drop:
- all
readOnlyRootFilesystem: true
volumeMounts:
- mountPath: /etc/coredns
name: config-volume
readOnly: true
dnsPolicy: Default
nodeSelector:
kubernetes.io/os: linux
priorityClassName: system-cluster-critical
serviceAccount: coredns
serviceAccountName: coredns
tolerations:
- operator: Exists
- key: CriticalAddonsOnly
operator: Exists
- effect: NoSchedule
key: node-role.kubernetes.io/master
volumes:
- configMap:
defaultMode: 420
items:
- key: Corefile
path: Corefile
name: coredns
name: config-volume
kubectl apply -f coredns-ds.yaml
kubectl delete deployment -n kube-system coredns
kubectl edit cm -n kube-system kube-proxy
注释掉 # kubeconfig: /var/lib/kube-proxy/kubeconfig.conf
部署OpenYurt的Control-Plane组件
克隆openyurt/yurt-app-manager仓库
cd进去
helm install yurt-app-manager -n kube-system ./charts/yurt-app-manager/
确认成功:
kubectl get pod -n kube-system | grep yurt-app-manager
kubectl get svc -n kube-system | grep yurt-app-manager
cat <<EOF | kubectl apply -f -
apiVersion: apps.openyurt.io/v1beta1
kind: NodePool
metadata:
name: master
spec:
type: Cloud
EOF
cat <<EOF | kubectl apply -f -
apiVersion: apps.openyurt.io/v1beta1
kind: NodePool
metadata:
name: worker
spec:
type: Edge
EOF
kubectl label node center apps.openyurt.io/desired-nodepool=master
部署openyurt/openyurt组件
在openyurt/openyurt中的组件包括:
yurt-controller-manager: 防止apiserver在断开连接时驱逐运行在边缘节点上的pod
yurt-tunnel-server: 在云端构建云边隧道
yurt-tunnel-agent: 在边缘侧构建云边隧道
如果你的云边节点不在同一网络平面内, 请手动修改values.yaml中tunnel相关参数:
cd openyurt/charts/openyurt/
vim values.yaml
yurtTunnelAgent.parameters.tunnelserverAddr="[公网ip]:31008": #用于tunnel agent连接tunnel server的公网IP与端口
yurtTunnelServer.parameters.certIps="[公网ip]": # tunnel server的公网IP
部署之前删除以前的东西:
rm -rf /var/lib/yurttunnel-server/pki
cd ../..
helm install openyurt -n kube-system ./charts/openyurt/
helm list -A
部署kuboard方便可视化
https://kuboard.cn/install/v3/install-built-in.html#%E5%AE%89%E8%A3%85
sudo docker run -d \
--restart=unless-stopped \
--name=kuboard \
-p 80:80/tcp \
-p 10081:10081/tcp \
-e KUBOARD_ENDPOINT="http://内网IP:80" \
-e KUBOARD_AGENT_SERVER_TCP_PORT="10081" \
-v /root/kuboard-data:/data \
eipwork/kuboard:v3
# 也可以使用镜像 swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3 ,可以更快地完成镜像下载。
# 请不要使用 127.0.0.1 或者 localhost 作为内网 IP \
# Kuboard 不需要和 K8S 在同一个网段,Kuboard Agent 甚至可以通过代理访问 Kuboard Server \
在浏览器输入 http://your-host-ip:80 即可访问 Kuboard v3.x 的界面,登录方式:
用户名: admin
密 码: Kuboard123
按要求复制.kube/config内容进去即可导入集群,然后请选择访问集群时所使用的身份,就进入集群了
主节点改造使其可以部署metrics-server和prometheus
主节点用ip是访问不到边缘节点的,因为边缘节点都是内网ip,主节点在外网无法访问,所以要利用openyurt的能力来访问。参考https://openyurt.io/zh/docs/user-manuals/monitoring/prometheus
如果metrics-server在主节点上,需要访问边缘节点的hostname,就需要dns解析,但是后面边缘节点加进来后,dns的解析可能会被负载均衡到自己的的coredns,而不是自己的coredns上,所以需要服务拓扑能力,参考https://openyurt.io/zh/docs/user-manuals/network/service-topology。而这个能力是YurtHub组件提供的,但是云端现在没有yurthub,只有在边缘端加入集群时才会自动部署yurthub。因此要手动部署yurthub。
详细的讨论可以看GitHub issue: https://github.com/openyurtio/openyurt/issues/1087
部署YurtHub
可以参考https://openyurt.io/zh/docs/installation/yurtadm-join#22-%E9%83%A8%E7%BD%B2edge%E5%B7%A5%E4%BD%9C%E6%A8%A1%E5%BC%8F%E7%9A%84yurthub
不过我们这里是要部署cloud模式的yurthub
从openyurt repo获取yurthub.yaml,执行如下修改后上传到边缘节点的/etc/kubernets/manifests目录。我粘贴在下面了。
获取 apiserver 的地址 (即ip:port) 和 bootstrap token ,用于替换模板文件 yurthub.yaml 中的对应值
获取 token 用命令:
kubeadm token list
最后要加上一行 - --working-mode=cloud
apiVersion: v1
kind: Pod
metadata:
labels:
k8s-app: yurt-hub
name: yurt-hub
namespace: kube-system
spec:
nodeName: center
volumes:
- name: hub-dir
hostPath:
path: /var/lib/yurthub
type: DirectoryOrCreate
- name: kubernetes
hostPath:
path: /etc/kubernetes
type: Directory
- name: pem-dir
hostPath:
path: /var/lib/kubelet/pki
type: Directory
containers:
- name: yurt-hub
image: openyurt/yurthub:latest
imagePullPolicy: IfNotPresent
volumeMounts:
- name: hub-dir
mountPath: /var/lib/yurthub
- name: kubernetes
mountPath: /etc/kubernetes
- name: pem-dir
mountPath: /var/lib/kubelet/pki
command:
- yurthub
- --v=2
- --server-addr=https://127.0.0.1:6443
- --node-name=$(NODE_NAME)
- --join-token=vbiai7.npup027fe0m7woei
- --working-mode=cloud
livenessProbe:
httpGet:
host: 127.0.0.1
path: /v1/healthz
port: 10267
initialDelaySeconds: 300
periodSeconds: 5
failureThreshold: 3
resources:
requests:
cpu: 150m
memory: 150Mi
limits:
memory: 300Mi
securityContext:
capabilities:
add: ["NET_ADMIN", "NET_RAW"]
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
hostNetwork: true
priorityClassName: system-node-critical
priority: 2000001000
然后复制到静态pod目录,k8s会自动创建pod
cp yurthub.yaml /etc/kubernetes/manifests/
在kuboard里可以看容器信息:
http://[公网ip]/kubernetes/openyurt/namespace/kube-system/pods/yurt-hub-center
可以看看日志有没有出问题,如果出现start proxying就说明启动成功了
然后要配置kubelet,让它通过yurthub访问api-server,主节点上就可以拥有服务拓扑能力了。
mkdir -p /var/lib/openyurt
cat << EOF > /var/lib/openyurt/kubelet.conf
apiVersion: v1
clusters:
- cluster:
server: http://127.0.0.1:10261
name: default-cluster
contexts:
- context:
cluster: default-cluster
namespace: default
user: default-auth
name: default-context
current-context: default-context
kind: Config
preferences: {}
EOF
修改kubelet服务,使其使用刚刚创建的配置
为了让 kubelet 使用新的 kubeconfig,我们编辑 kubelet 服务的 drop-in 文件(即 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
或者 /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
在 CentOS 系统上))。
sed -i "s|KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=\/etc\/kubernetes\/bootstrap-kubelet.conf\ --kubeconfig=\/etc\/kubernetes\/kubelet.conf|KUBELET_KUBECONFIG_ARGS=--kubeconfig=\/var\/lib\/openyurt\/kubelet.conf|g" \
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
然后,我们重启 kubelet 服务。
systemctl daemon-reload && systemctl restart kubelet
为了激活kube-proxy和coredns的服务拓扑能力,重启这两个pod。(因为是daemonset部署的,删除pod之后kubelet会自动重建新的pod,相当于重启,可以在kuboard里面删除pod,或者用命令删除。)
部署metrics-server
使用kuboard自动部署
最后一步勾选副本数为1
刷新页面就可以看到节点监控信息:
但是现在只是主节点能看到,后面加上边缘节点是看不到的,需要修改yaml配置,在kuboard进入kube-system命名空间,进入metrics-server,修改yaml:
把参数中kubelet的地址中Hostname提到最前面:
这时会发现看不到监控信息了,查看日志可以看到它无法解析hostname,所以要配置dns。可以参考openyurt中搭建prometheus中如何配置dns的:https://openyurt.io/zh/docs/user-manuals/monitoring/prometheus#1%E4%BF%AE%E6%94%B9coredns%E9%85%8D%E7%BD%AE
- 将
yurt-tunnel-nodes
挂载至coreDNS中,patch命令相当于修改yaml,可以去看看coredns的yaml是不是被改了。官方文档给的patch的是deployment,记得我们是daemonset部署的,所以要改成daemonset。
可以看到确实修改了kubectl patch daemonset coredns -n kube-system -p '{"spec": {"template": {"spec": {"volumes": [{"configMap":{"name":"yurt-tunnel-nodes"},"name": "edge"}]}}}}' kubectl patch daemonset coredns -n kube-system -p '{"spec": { "template": { "spec": { "containers": [{"name":"coredns","volumeMounts": [{"mountPath": "/etc/edge", "name": "edge", "readOnly": true }]}]}}}}'
- 修改coredns的configmap
这一步可以用他给的命令修改,也可以用kuboard修改,我这里用可视化界面:
添加
最后重启coredns,还是直接删除pod就行。hosts /etc/edge/tunnel-nodes { # add hosts plugin reload 300ms fallthrough }
这下就会发现metrics-server不会报错了,可以解析hostname了,原理就是coredns里面添加了
yurt-tunnel-nodes
configmap里面记录的ip,可以自己去看看这个configmap,相信可以理解原理。
prometheus后面再部署,现在可以先添加边缘节点了。
边缘节点加入
首先要安装好docker,不用花里胡哨的命令,用apt就行
apt install docker.io
然后要配置好docker的驱动为systemd
编译yurtadm
安装go环境
add-apt-repository ppa:longsleep/golang-backports
sudo apt-get install golang-1.16-go
在/home/用户名
目录下打开,root用户就在/root
下
vim .bashrc
# 添加
export GOROOT=/usr/lib/go-1.16/
export PATH=$PATH:$GOROOT/bin
# 编译
source .bashrc
重启之后需要重新执行,设置国内镜像
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
编译
git clone https://github.com/openyurtio/openyurt.git
cd openyurt
git checkout release-v1.1
make build WHAT="yurtadm" ARCH="amd64" REGION=cn
# arm64: make build WHAT="yurtadm" ARCH="arm64" REGION=cn
复制到bin目录下:(arm64记得改前面的目录)
cp _output/local/bin/linux/amd64/yurtadm /usr/local/bin/
一个节点编译好后,复制到其他节点需要修改权限:
cp yurtadm /usr/local/bin/
chmod 777 /usr/local/bin/yurtadm
join命令
apt install conntrack
不记得token在主节点用kubeadm token list
swapoff -a
yurtadm join [公网ip]:6443 --token=vbiai7.npup027fe0m7woei --node-type=edge --discovery-token-unsafe-skip-ca-verification --v=5
如果出现问题就看日志
journalctl -u kubelet -xe
还可以参考https://blog.csdn.net/weixin_43168190/article/details/127774243
重启节点后记得还需要关闭swap,然后重启kubelet
swapoff -a
systemctl restart kubelet
加入成功后记得看看能不能看每个pod的日志,在命令行随便看一个边缘节点:
kubectl get pods -n kube-system -o wide | grep dell2018
然后随便看一个pod的日志:
kubectl logs kube-flannel-ds-l8bxl -n kube-system
如果出现问题,翻到最后面
部署prometheus
首先注意兼容性:
我们使用0.10版本
git clone https://github.com/prometheus-operator/kube-prometheus.git
cd kube-prometheus
git checkout release-0.10
Prometheus的安装方式参考:https://github.com/prometheus-operator/kube-prometheus#quickstart
# Create the namespace and CRDs, and then wait for them to be available before creating the remaining resources
# Note that due to some CRD size we are using kubectl server-side apply feature which is generally available since kubernetes 1.22.
# If you are using previous kubernetes versions this feature may not be available and you would need to use kubectl create instead.
kubectl apply --server-side -f manifests/setup
kubectl wait \
--for condition=Established \
--all CustomResourceDefinition \
--namespace=monitoring
kubectl apply -f manifests/
由于网络原因,会有两个拉取不下来镜像:
进入编辑,进入容器信息,修改镜像,我在dockerhub找到两个镜像,跟k8s官方是一样的,修改成这两个:
kubesphere/kube-state-metrics
v5cn/prometheus-adapter
修改后就能成功拉取了
然后把prometheus-k8s和grafana的ip改为nodePort,就能访问了。
某些问题解决
主节点初始化失败
error execution phase upload-config/kubelet: Error writing Crisocket information for the control-plane node: timed out waiting for the condition
看日志
journalctl -u kubelet -xe
我发现它去请求10261端口了,这是yurthub的端口,我上次修改了配置忘记还原了
参考这里的修改,还原配置文件就好了,如果以前没部署过openyurt那就跟我问题不一样,自己去搜一搜吧。
https://openyurt.io/zh/docs/installation/yurtadm-join#23-%E9%85%8D%E7%BD%AEkubelet
为了部署metrics-server后面还会再改回来。。。
无法使用kubectl logs命令
显示:
You must be logged in to the server (the server has asked for the client to provide credentials ( pods/log kube-flannel-ds-l8bxl))
很可能是上次的没删干净,看这个issue:https://github.com/openyurtio/openyurt/issues/984
解决方法:
rm -rf /var/lib/yurttunnel-server/pki
然后要重启yurt-tunnel-server和agent,我们是用helm部署的:
helm list -A
helm delete openyurt -n kube-system
进入openyurt仓库目录重新部署:
helm install openyurt -n kube-system ./charts/openyurt/
过一会儿kubectl logs或者exec命令就能用了。
通用问题解决方法
一个是看kubelet日志
journalctl -u kubelet -xe
一个是看docker的日志,用
docker ps -a
可以看到全部的docker容器,看有没有状态是Exit的,然后看这个容器的日志,在根据日志里的东西去搜索。
docker logs 容器id