文章目录
因为默认的是内网IP,复制出来后,后改为外面IP,报错
Unable to connect to the server: x509: certificate is valid for 10.0.1.27, 192.168.0.x, not x.x.x.x
原因从报错信息可以看出来:是证书对访问的IP做了校验,解决的方法就是要重新制作证书(不用动集群)。
cp -r /etc/kubernetes /etc/kubernetes.bak
rm -rf /etc/kubernetes/pki/apiserver.*
kubeadm init phase certs apiserver --apiserver-advertise-address ${Internal_IP} --apiserver-cert-extra-sans ${External_IP}
例如:
kubeadm init phase certs apiserver --apiserver-advertise-address 10.0.1.27 --apiserver-cert-extra-sans 122.51.103.44
kubeadm alpha certs renew admin.conf
kubectl -n kube-system delete pod -l component=kube-apiserver
\cp /etc/kubernetes/admin.conf ~/.kube/config
注意:这里生成的
admin.conf文件,server填写的依然是master的内网IP,如果需要放在集群外的客户端上使用,将这个IP改为master的外网IP即可。
参考 https://www.cnblogs.com/leozhanggg/p/16243205.html
下载kubectl.exe的可执行文件,我这里下载的是对应我们线上kubernetes版本的kubectl。如果想要下载其他版本,可以复制上面链接将版本号改对对应的即可。
将kubectl添加到PATH环境变量
在D盘下创建kube文件夹,将kubectl.exe存放在kube文件夹下。

将D:\kube\kubectl添加到PATH环境变量中

执行命令查看已安装的 kubectl 版本号
C:\Users\16872>kubectl version
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.5", GitCommit:"5c99e2ac2ff9a3c549d9ca665e7bc05a3e18f07e", GitTreeState:"clean", BuildDate:"2021-12-16T08:38:33Z", GoVersion:"go1.16.12", Compiler:"gc", Platform:"windows/amd64"}
Unable to connect to the server: dial tcp 127.0.0.1:6443: connectex: No connection could be made because the target machine actively refused it.
将kubectl config文件存放在~/.kube/下。 ~代表当前的用户目录
创建~/.kube文件夹,将master上的config文件拉取到本地, 存放在~/.kube/文件夹下
该
config文件支持公网IP连接(一配置)
验证配置结果
PS C:\Users\16872> kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 4h7m v1.21.2
node1 Ready <none> 4h3m v1.21.2
node2 Ready <none> 4h3m v1.21.2
PS C:\Users\16872> kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-69cccc84d-jcc4f 1/1 Running 3 4h1m
calico-node-6qvhg 1/1 Running 1 4h1m
calico-node-jpqbc 1/1 Running 1 4h1m
calico-node-xg558 1/1 Running 2 4h1m
coredns-59d64cd4d4-cb6hg 1/1 Running 2 4h7m
coredns-59d64cd4d4-w9nt4 1/1 Running 2 4h7m
etcd-master 1/1 Running 1 4h7m
ingress-nginx-controller-qkw2c 1/1 Running 0 39m
ingress-nginx-defaultbackend-c49866855-dlst8 1/1 Running 0 39m
kube-apiserver-master 1/1 Running 1 4h7m
kube-controller-manager-master 1/1 Running 1 4h7m
kube-proxy-4jtzf 1/1 Running 2 4h3m
kube-proxy-6gbxz 1/1 Running 1 4h7m
kube-proxy-ljjct 1/1 Running 1 4h3m
kube-scheduler-master 1/1 Running 1 4h7m
<!--kubernetes-client-->
<dependency>
<groupId>io.kubernetes</groupId>
<artifactId>client-java</artifactId>
<version>16.0.0</version>
</dependency>
版本选择参考 https://github.com/kubernetes-client/java/wiki/2.-Versioning-and-Compatibility
编辑配置添加-Djdk.tls.client.protocols=TLSv1.2,

否则报错
io.kubernetes.client.openapi.ApiException: javax.net.ssl.SSLHandshakeException: extension (5) should not be presented in certificate_request
@Override
@SneakyThrows
public Boolean createCpsGo() {
ApiClient client = Config.defaultClient();
Configuration.setDefaultApiClient(client);
// new一个statefulSet
V1StatefulSet body = new V1StatefulSet()
.metadata(new V1ObjectMeta().name("pod-go"))
.spec(new V1StatefulSetSpec()
.serviceName("pod-go")
.replicas(3)
.selector(new V1LabelSelector().matchLabels(Map.of("app", "pod-go")))
.template(new V1PodTemplateSpec()
.metadata(new V1ObjectMeta().labels(Map.of("app", "pod-go")))
.spec(new V1PodSpec().containers(List.of(
new V1Container()
.name("pod-go")
.image("registry.cn-shanghai.aliyuncs.com/wanfei/centos7-golang-sh:v1")
.imagePullPolicy("IfNotPresent")
.stdin(true)
.tty(true)
)))
)
);
// 运行statefulSet
AppsV1Api appsV1Api = new AppsV1Api();
appsV1Api.createNamespacedStatefulSet("default", body, null, null, null, null);
return true;
}
创建成功
[root@master jenkins]# kubectl get StatefulSet | grep pod-go
pod-go 3/3 17s
例如:生成文件,压缩文件
@Override
@SneakyThrows
public Boolean createFile() {
// 生成 pod-go-0.exe 文件命令
String shExeCmd = "sh build.sh /app/test/ pod-go-0";
// 压缩 pod-go-0.exe 为 pod-go-0.zip
String shZipCmd = "zip /app/test/pod-go-0.zip /app/test/pod-go-0.exe";
ApiClient client = Config.defaultClient();
Configuration.setDefaultApiClient(client);
// 执行kubectl exec在指定pod内运行命令
String shExeStr = execForStr(shExeCmd);
log.info("编译exe文件返回: {}", shExeStr);
String shZipStr = execForStr(shZipCmd);
log.info("压缩exe文件返回: {}", shZipStr);
return true;
}
/**
* 执行kubectl exec
* @param command 命令
*/
@SneakyThrows
private static String execForStr(String command) {
Exec exec = new Exec();
Process proc = exec.exec("default", "pod-go-0", ArrayUtil.toArray(List.of("/bin/sh", "-c", command), String.class), "pod-go", true, true);
return RuntimeUtil.getResult(proc);
}
编译压缩成功
[root@pod-go-0 test]# ls
main.go pdf1.syso pod-go-0.exe pod-go-0.zip
@Override
@SneakyThrows
public Boolean deleteCpsGo() {
ApiClient client = Config.defaultClient();
Configuration.setDefaultApiClient(client);
AppsV1Api appsV1Api = new AppsV1Api();
appsV1Api.deleteNamespacedStatefulSet("pod-go", "default", null, null, null, null, null, null);
return true;
}
部署到线上后发现报错

进入pod执行
[root@pod-java-67cdc944f8-jknpq app]# kubectl get pods
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:default:default" cannot list resource "pods" in API group "" in the namespace "default"
创建最高权限的角色
cat <<EOF> client-java-sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: client-java-sa
namespace: default
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: client-java-sa-clusterrolebinding
subjects:
- kind: ServiceAccount
name: client-java-sa
namespace: default
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
EOF
部署
java应用的时候使用client-java-sa这个ServiceAccount,否则会使用默认的default这个ServiceAccount
添加serviceAccountName: client-java-sa

部署
kubectl apply -f client-java-sa.yaml
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po