K8S - 用kubectl远程访问内网的k8s集群

在之前的文章

K8S - 在任意node里执行kubectl 命令

介绍过, 通过任何node 的主机, 用kubectl 管理集群是很简单

无非就是两个步骤:

  1. 下载 k8s master 上的admin.conf
  2. 在当前主机配置 K8SCONFIG 环境变量指向 下载的config file



其他内网主机也适用

其实上面的方法也适用于内网的其他主机, 即使它不是k8s 集群的主机一员, 亲自测试,可行



外网主机的问题

如果想在k8s 集群内部网络用kubectl 访问 k8s 内网集群的话并不是那么简单
因为本文的k8s-master 并没有外网ip。

有两个理论上可行的方案

  1. 为k8s-master 分配1个外网ip, kubectl 经internet 去调用 k8s 集群的apiservice
  2. 在另1台有外网ip的同内网主机设置 反向代理 (nginx)

我首先尝试 的是方案2, 因为它能节省1个外网ip 的费用。
但是各种问题下, 又在google上找不到1个现有的方案例子, 就放弃了

所以本文的解决方案是方案1.



先申请外网ip

terrafrom 脚本:

resource "google_compute_address" "static-ip-1" {
  name = "static-ip-1"
  address_type = "EXTERNAL"
}



绑定外网ip 到 k8s-master 主机

ui 动态操作就好
在这里插入图片描述



在外网主机-我的本地laptop 设置kubectl

好了, 这个步骤 跟本文开头地道的基本一样, 只不过多了1个改 apiserver的步骤

1. 在本机安装kubectl
sudo pacman -S kubectl

最新版就好



下载 k8s-master 的admin.conf
cd ~
mkdir -p conf
cd conf
gcloud compute scp root@k8s-master:/etc/kubernetes/admin.conf .



配置K8SCONFIG
[gateman@manjaro-x13 conf]$ cat ~/.bashrc | grep KUBE
export KUBECONFIG=/home/gateman/conf/admin.conf



修改 admin.conf 的apiserver 地址

server: 那行改成 外网ip 地址
在这里插入图片描述



测试
[gateman@manjaro-x13 conf]$ kubectl get nodes
Unable to connect to the server: tls: failed to verify certificate: x509: certificate is valid for 10.96.0.1, 192.168.0.3, not 34.142.35.168

出错了
原因很简单, 因为apiserver 是https 协议, 上面的地址也看到了, k8s 默认的apiserver 证书 只cover了 10.96.0.1 和 192.168.0.3 的ip, 外网ip 是没有cover的

解决方法简单

alias kubectl=kubectl --insecure-skip-tls-verify

但是这个方法不够优雅, 不是所谓的Strategic solution, 只是个Tatical solution



为k8s 集群更新外网ip的 apiserver 证书



备份apiserver 证书

如果k8s 是用kubeadm方式安装的, 那么证书在 /etc/kubernetes/pki

gateman@k8s-master:~$ ls /etc/kubernetes/pki
apiserver-etcd-client.crt  apiserver-kubelet-client.crt  apiserver.crt  backup  ca.key  front-proxy-ca.crt  front-proxy-client.crt  sa.key
apiserver-etcd-client.key  apiserver-kubelet-client.key  apiserver.key  ca.crt  etcd    front-proxy-ca.key  front-proxy-client.key  sa.pub

gateman@k8s-master:~$ sudo cp apiserver.crt apiserver.key backup/



导出 kubeadm 配置
root@k8s-master:~# mkdir -p cert_external_ip/ && cd cert_external_ip/
kroot@k8s-master:~/cert_external_ip# kubectl -n kube-system get configmap kubeadm-config -o jsonpath='{.data.ClusterConfiguration}' > kubeadm.yaml



修改 kubeadm, 添加 external ip
root@k8s-master:~/cert_external_ip# cat kubeadm.yaml 
apiServer:
  certSANs:
    - 34.142.35.168
  extraArgs:
    authorization-mode: Node,RBAC
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.23.6
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.96.0.0/12
scheduler: {}
root@k8s-master:~/cert_external_ip# 

就是 certSANs 的两行, 注意大小写



在生成新证书前 删除旧证书
cd /etc/kubernetes/pki
rm apiserver.crt apiserver.key



生成新的证书
kubeadm init phase certs apiserver --config kubeadm.yaml

注意这个命令会直接在 /etc/kubernetes/pki 生成新的证书, 当旧证书存在是不会生成, 所以之前要先拿走旧证书



重启 apiserver

无非就是shutdown apiserver
它会自动重新启动

docker kill $(docker ps | grep kube-apiserver | grep -v pause | awk '{print $1}')



更新 configMap 里的kubeadm配置

其实观察下上面导出 kubeadm.yaml 的命令, 其实是从configmap导出的

我们只在本地修改了 kubeadm.yaml 文件并基于它重新生成了apiserver key

到了这一步, 相信外网主机已经能远程登陆。

但是configmap里的 kubeadm 配置并没有更新

为了更strategic , 我们应该把修改后的kubeadm(增加了 certSANs) 更新回configMap.
不更新回去有什么问题?

  1. 下次再修改, 可能会忘了 ip的配置, 覆盖掉
  2. k8s集群的更新可能会覆盖apiserver 配置

命令

kubeadm config upload from-file --config kubeadm.yaml

但是我当前的版本1.26.3 是会出错的

root@k8s-master:~# kubeadm config upload from-file --config kubeadm.yaml
unknown flag: --config
To see the stack trace of this error execute with --v=5 or higher

work around:
手动更新:

kubectl edit configmap kubeadm-config -n kube-system



本地测试

pass!

[gateman@manjaro-x13 conf]$ kubectl get nodes
NAME         STATUS   ROLES                  AGE    VERSION
k8s-master   Ready    control-plane,master   106d   v1.23.6
k8s-node0    Ready    <none>                 106d   v1.23.6
k8s-node1    Ready    <none>                 106d   v1.23.6
k8s-node3    Ready    <none>                 86d    v1.23.6
[gateman@manjaro-x13 conf]$ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/698004.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【图书推荐】《分布式数据库HBase案例教程》

本书重点 最后一章HBase项目实战——论坛日志分析&#xff0c;可以作为研究课题和毕业论文素材&#xff0c;值得收藏。 本书配套示例源码、PPT课件、开发环境、教学视频、习题及答案以及其他丰富的教学资源&#xff0c;方便自学。 内容简介 本书定位是HBase从入门到应用的简…

探索智慧机场运营中心解决方案的价值与应用

随着全球航空业的不断发展&#xff0c;机场运营中心的作用日益凸显。智慧机场运营中心解决方案以其高效的管理和智能化的运营模式&#xff0c;成为优化机场运营、提升服务水平的重要工具。本文将深入探讨智慧机场运营中心解决方案的价值与应用&#xff0c;揭示其在机场管理中的…

[大模型]GLM-4-9B-Chat vLLM 部署调用

vLLM 简介 vLLM 框架是一个高效的大型语言模型&#xff08;LLM&#xff09;推理和部署服务系统&#xff0c;具备以下特性&#xff1a; 高效的内存管理&#xff1a;通过 PagedAttention 算法&#xff0c;vLLM 实现了对 KV 缓存的高效管理&#xff0c;减少了内存浪费&#xff0…

python脚本打包为exe并在服务器上设置定时执行

python脚本打包为exe并在服务器上设置定时执行 1. Python脚本打包2. 将打包好的Python脚本放入服务器3. 在服务器上设置其定时执行 1. Python脚本打包 首先&#xff0c;下载pyinstaller 键盘winR打开终端&#xff0c;输入命令&#xff1a;pip install pyinstaller&#xff0c;…

nodejs:centos7安装nodejs-v20.14.0

# 升级glibc 请参考【https://blog.csdn.net/chenhz2284/article/details/139584458?spm1001.2014.3001.5502】 # 升级libstdc 请参考【https://blog.csdn.net/chenhz2284/article/details/139584721?spm1001.2014.3001.5502】 # 安装nodejs cd /chz/install/nodejs# 下…

解决Vue项目Network: unavailable的问题

在vscode使用 npm run serve 运行 Vue项目时发现一个问题&#xff0c;项目只能通过Local访问而不能通过Network访问&#xff0c;终端显示如下&#xff1a; 碰到这种情况的解决方法&#xff1a;在环境变量的path中添加“C:\Windows\System32\Wbem” 1.找到“环境变量”&#xf…

达梦数据库搭建守护集群

前言 DM 数据守护&#xff08;Data Watch&#xff09;是一种集成化的高可用、高性能数据库解决方案&#xff0c;是数据库异地容灾的首选方案。通过部署 DM 数据守护&#xff0c;可以在硬件故障&#xff08;如磁盘损坏&#xff09;、自然灾害&#xff08;地震、火灾&#xff09…

【python】python 电子产品销售分析可视化(数据集+源码)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

【已解决】chrome视频无法自动播放的问题

问题&#xff1a; 在用datav开发大屏的时候&#xff0c;放了一个视频组件&#xff0c;但是发现视频组件即使设置了自动播放&#xff0c;仍然无法自动播放 原因&#xff1a; 76 以上版本的谷歌浏览器只能在系统静音下自动播放 解决&#xff1a; 音频自动播放浏览器白名单设置&…

幕墙设计乙级资质:企业技术负责人经验与教育背景

幕墙设计乙级资质中&#xff0c;对企业技术负责人的经验与教育背景有着明确的要求。以下是具体的解读&#xff1a; 一、教育背景 企业技术负责人应具备大学本科或以上学历&#xff0c;这是对其基本教育背景的要求。同时&#xff0c;这一学历背景通常需要在建筑、土木工程、结构…

一文细谈SNN的基本数学原理,LIF模型,STDP与STBP学习方法

首先本文是读完 如何看待第三代神经网络SNN&#xff1f;详解脉冲神经网络的架构原理、数据集和训练方法 原创-CSDN博客 一文通俗入门脉冲神经网络(SNN)第三代神经网络-CSDN博客 两篇文章的总结&#xff0c;文章仅用于学习。 本文主要讨论STDP和STBP方法。 我们都知道&…

YoloV9改进策略:Block篇|FFA-Net:用于单图像去雾的特征融合注意力网络(独家原创)

摘要 本文使用FFA-Net的Block改进YoloV9&#xff0c;使用Block替换RepNCSP中的RepNRes&#xff0c;非常简单&#xff01;Block由卷积、通道注意力、像素注意力组成。结构图如下&#xff1a; 论文翻译&#xff1a;《FFA-Net&#xff1a;用于单图像去雾的特征融合注意力网络》…

夺冠了!U19国足是什么?这场夺冠对于中国足球意味着什么?

夺冠了&#xff01;U19国足是什么&#xff1f;这场夺冠对于中国足球意味着什么&#xff1f; 在2024年“丝绸之路华山杯”渭南国际足球邀请赛中&#xff0c;中国U19国家男子足球队以出色的表现&#xff0c;力压群雄&#xff0c;最终夺得冠军。这一成绩不仅是对U19国足队员们辛勤…

ROS1配置husky仿真环境遇到的一些问题+方法论

ROS 系列学习教程(总目录) 本文目录 一、问题描述二、问题分析2.1 分析日志2.2 尝试一&#xff08;失败&#xff09;2.3 尝试二&#xff08;成功&#xff09; 三、husky仿真需要安装的软件包四、总结 - 方法论4.1 文件路径不合法4.2 文件内容不合法4.3 ROS 环境变量4.3.1 方法一…

Spring Boot集成tablesaw插件快速入门Demo

1.什么是tablesaw&#xff1f; Tablesaw是一款Java的数据可视化库&#xff0c;主要包括两部分&#xff1a; 数据解析库&#xff0c;主要用于加载数据&#xff0c;对数据进行操作(转化&#xff0c;过滤&#xff0c;汇总等)&#xff0c;类比Python中的Pandas库&#xff1b;数据…

idea鼠标滚轮滚动放大缩小字体

在idea中的【file】->【settings】菜单&#xff0c;弹出settings窗口&#xff0c;点击窗口中的【Editor】->【General】&#xff0c;在右侧窗口中&#xff0c;选中【Change font size with CtrlMouse Wheel in All editors】即可。

Apollo9.0 PNC源码学习之Control模块(二)

前面文章&#xff1a;Apollo9.0 PNC源码学习之Control模块&#xff08;一&#xff09; 本文将对具体控制器以及原理做一个剖析 1 PID控制器 1.1 PID理论基础 如下图所示&#xff0c;PID各参数(Kp,Ki,Kd)的作用&#xff1a; 任何闭环控制系统的首要任务是要稳、准、快的响…

AdroitFisherman模块测试日志(2024/6/10)

测试内容 测试AdroitFisherman分发包中SHAUtil模块。 测试用具 Django5.0.3框架&#xff0c;AdroitFisherman0.0.31 项目结构 路由设置 总路由 from django.contrib import admin from django.urls import path,include from Base64Util import urls urlpatterns [path(ad…

教育的数字化转型——Kompas.ai如何变革学习体验

引言 在现代教育中&#xff0c;数字化转型逐渐成为提升学习效果的重要手段。随着科技的进步&#xff0c;人工智能&#xff08;AI&#xff09;在教育领域的应用越来越广泛。本文将探讨教育数字化转型的发展趋势&#xff0c;并介绍Kompas.ai如何通过AI技术变革学习体验。 教育数…

Nodejs 第七十六章(MQ进阶)

MQ介绍和基本使用在上一章介绍过了&#xff0c;不再重复 消息&#xff1a;在RabbitMQ中&#xff0c;消息是传递的基本单元。它由消息体和可选的属性组成 生产者Producer&#xff1a;生产者是消息的发送方&#xff0c;它将消息发送到RabbitMQ的交换器&#xff08;Exchange&…