- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
secret和configmap资源都是通过挂载的方式将对应数据挂载到容器内部环境中去使用,两者的使用没有太多的不同 ,configmap资源通常用于为pod提供配置文件;secret资源主要用于为pod提供证书、用户名密码等敏感数据; 。
Configmap将非机密性信息(如配置信息)和镜像解耦, 实现方式为将配置信息放到configmap对象中,然后在pod的中作为Volume挂载到pod中,从而实现导入配置的目的.
Secret 的功能类似于 ConfigMap给pod提供额外的配置信息,但是Secret是一种包含少量敏感信息例如密码、令牌或密钥的对象。Secret 的名称必须是合法的 DNS 子域名。每个Secret的大小最多为1MiB,主要是为了避免用户创建非常大的Secret进而导致API服务器和kubelet内存耗尽,不过创建很多小的Secret也可能耗尽内存,可以使用资源配额来约束每个名字空间中Secret的个数。在通过yaml文件创建secret时,可以设置data或stringData字段,data和stringData字段都是可选的,data字段中所有键值都必须是base64编码的字符串,如果不希望执行这种 base64字符串的转换操作,也可以选择设置stringData字段,其中可以使用任何非加密的字符串作为其取值.
首先用户向apiserver提交创建secret资源的请求;apiserver收到用户的资源创建请求,通过apiserver的认证授权、准入控制后,apiserver会将创建好的secret信息存放在etcd中;随后用户在创建pod中调用了挂载某个secret以后,对应在pod创建时会被pause容器将对应secret资源中的data数据加载至对应pod中,从而实现让向pod内部传递敏感数据的目的; 。
Kubernetes默认支持多种不同类型的secret,用于一不同的使用场景,不同类型的secret的配置参数也不一样.
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
data:
mysite: |
server {
listen 80;
server_name www.mysite.com;
index index.html index.php index.htm;
location / {
root /data/nginx/mysite;
if (!-e $request_filename) {
rewrite ^/(.*) /index.html last;
}
}
}
myserver: |
server {
listen 80;
server_name www.myserver.com;
index index.html index.php index.htm;
location / {
root /data/nginx/myserver;
if (!-e $request_filename) {
rewrite ^/(.*) /index.html last;
}
}
}
data字段中的mysite和myserver是用来标识不同配置信息的,即该名称用于pod挂载configmap资源时被引用的名称; 。
应用资源配置清单 。
kubectl apply -f nginx-configmap-demo.yaml
验证configmap资源 。
kubectl get cm
kubectl describe cm nginx-config
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: ng-deploy-80
template:
metadata:
labels:
app: ng-deploy-80
spec:
containers:
- name: ng-deploy-80
image: harbor.ik8s.cc/baseimages/nginx:1.20.0
ports:
- containerPort: 80
volumeMounts:
- mountPath: /data/nginx/mysite
name: nginx-mysite-statics
- mountPath: /data/nginx/myserver
name: nginx-myserver-statics
- name: nginx-mysite-config
mountPath: /etc/nginx/conf.d/mysite/
- name: nginx-myserver-config
mountPath: /etc/nginx/conf.d/myserver/
volumes:
- name: nginx-mysite-config
configMap:
name: nginx-config
items:
- key: mysite
path: mysite.conf
- name: nginx-myserver-config
configMap:
name: nginx-config
items:
- key: myserver
path: myserver.conf
- name: nginx-myserver-statics
nfs:
server: 192.168.0.42
path: /data/k8sdata/myserver
- name: nginx-mysite-statics
nfs:
server: 192.168.0.42
path: /data/k8sdata/mysite
---
apiVersion: v1
kind: Service
metadata:
name: ng-deploy-80
spec:
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30019
protocol: TCP
type: NodePort
selector:
app: ng-deploy-80
上述配置清单主要定义了一个deploy类型的控制器和nodeport类型的service,其中deploy控制器定义了一个nginx pod 挂载使用nfs服务上的静态资源和挂载使用configmap给nginx提供配置;service主要定义了通过标签选择器来匹配pod来实现将用户请求的流量转发至后端nginx pod,
在nfs服务器上准备静态资源目录 。
在nfs服务器上创建静态资源 。
应用配置清单创建pod使用configmap资源和挂载nfs服务器上的静态资源 。
kubectl apply -f nginx-dep-demo.yaml
验证,查看pod配置信息是否正常被pod挂载?
可以看到pod正常挂载configmap中指定的配置信息; 。
在k8s集群节点任意节点上修改hosts文件来解析域名 。
在k8s的节点上将对应域名指向集群任意节点地址上即可 。
访问nginx,看看对应nfs静态资源是否能够正常被访问到?
这里虽然能够正常被访问nginx主页,但是不是我们想要的页面,这其中的原因是,我们把nginxpod的配置文件挂载的路径没有在nginx.conf中导入,导致我们挂载的配置在nginx中没有生效; 。
解决办法 。
进入nginxpod,修改主配置文件 。
这里主要加上导入/etc/nginx/conf.d/下子目录下的.conf结尾的配置文件,让/etc/nginx/conf.d/myserver/myserver.conf和/etc/nginx/conf.d/mysite/mysite.conf配置文件被nginx加载; 。
验证:使用不同域名访问nginx看看是否能够访问到对应不同的静态资源?
现在使用不同域名的方式访问nginx就可以访问到不同站点的资源了;生产中会通过前端一个负载均衡器来反向代理nodeport类型的service; 。
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
data:
host: "172.31.7.189"
username: "user1"
password: "12345678"
应用上述配置清单,创建configmap资源 。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: ng-deploy-80
template:
metadata:
labels:
app: ng-deploy-80
spec:
containers:
- name: ng-deploy-80
image: harbor.ik8s.cc/baseimages/nginx:1.20.0
env:
- name: HOST
valueFrom:
configMapKeyRef:
name: nginx-config
key: host
- name: USERNAME
valueFrom:
configMapKeyRef:
name: nginx-config
key: username
- name: PASSWORD
valueFrom:
configMapKeyRef:
name: nginx-config
key: password
######
- name: "password"
value: "123456"
ports:
- containerPort: 80
向pod内部传递环境变量的方式有两种,一种是通过env字段来引用configmap资源,使用name字段来指定环境变量名称,使用valueFrom字段来指定对应环境变量值的来源;configMapKeyRef字段表示使用configmap资源来向对应环境变量赋值;name是指定configmap的名称,key是用来指定configmap中对应key;另外一种就是使用env字段,通过列表的方式直接向pod传递键值环境变量; 。
应用配置清单 。
可以看到创建的pod内部有我们再configmap中定义的环境变量,也有我们通过env直接指定键值的环境变量; 。
openssl req -x509 -sha256 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 3560 -nodes -subj '/CN=www.ca.com'
openssl req -new -newkey rsa:4096 -keyout server.key -out server.csr -nodes -subj '/CN=www.mysite.com'
openssl x509 -req -sha256 -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
kubectl create secret tls myserver-tls-key --cert=./server.crt --key=./server.key
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
data:
default: |
server {
listen 80;
server_name www.mysite.com;
listen 443 ssl;
ssl_certificate /etc/nginx/conf.d/certs/tls.crt;
ssl_certificate_key /etc/nginx/conf.d/certs/tls.key;
location / {
root /usr/share/nginx/html;
index index.html;
if ($scheme = http ){ #未加条件判断,会导致死循环
rewrite / https://www.mysite.com permanent;
}
if (!-e $request_filename) {
rewrite ^/(.*) /index.html last;
}
}
}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myserver-myapp-frontend-deployment
spec:
replicas: 1
selector:
matchLabels:
app: myserver-myapp-frontend
template:
metadata:
labels:
app: myserver-myapp-frontend
spec:
containers:
- name: myserver-myapp-frontend
image: harbor.ik8s.cc/baseimages/nginx:1.20.0
ports:
- containerPort: 80
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d/myserver
- name: myserver-tls-key
mountPath: /etc/nginx/conf.d/certs
volumes:
- name: nginx-config
configMap:
name: nginx-config
items:
- key: default
path: mysite.conf
- name: myserver-tls-key
secret:
secretName: myserver-tls-key
---
apiVersion: v1
kind: Service
metadata:
name: myserver-myapp-frontend
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30018
protocol: TCP
- name: htts
port: 443
targetPort: 443
nodePort: 30019
protocol: TCP
selector:
app: myserver-myapp-frontend
上述配置清单主要创建了一个configmap资源,用来给nginxpod提供配置信息,然后创建了一个deploy控制器运行了一个nginx pod ,这个pod挂载使用configmap和secret资源;最后创建了一个service将对应nginx Pod服务暴露给集群外部客户端访问; 。
应用配置清单 。
验证:进入pod内部,查看对应配置信息和证书文件是否正常挂载?
可以看到我们创建configmap资源中的配置信息和secret资源中的证书信息都正常挂载至nginx pod对应指定目录下 。
修改nginx主配置文件,让其加载我们通过configmap挂载的配置文件 。
重载nginx pod配置文件 。
上述方法不推荐,正确的做法就是在打镜像的时候,将对应配置文件打入镜像;或者我们使用configmap将对应配置信息创建为configmap资源对象,然后再pod中挂载对应配置信息即可; 。
验证:访问集群任意节点30018端口和30019端口,看看对应nginx pod是否能够正常被访问?是否是加密访问呢?
从上面的访问情况可以看到,直接访问30019,会报400,这是因为30019时一个https的端口,用http的协议去访问肯定不能正常响应;当我们访问30018时,对应页面会进行跳转到https://www.mysite.com,这是因为我们在nginx的配置中配置了访问http端口进行重定向https://www.mysite.com;访问30019端口时,用https协议访问30019时,也正常加载了证书; 。
使用configmap将nginx配置信息导入主配置文件 。
apiVersion: v1
kind: ConfigMap
metadata:
name: include-conf
data:
include.conf: |
include /etc/nginx/conf.d/*/*.conf;
---
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
data:
default: |
server {
listen 80;
server_name www.mysite.com;
listen 443 ssl;
ssl_certificate /etc/nginx/conf.d/certs/tls.crt;
ssl_certificate_key /etc/nginx/conf.d/certs/tls.key;
location / {
root /usr/share/nginx/html;
index index.html;
if ($scheme = http ){ #未加条件判断,会导致死循环
rewrite / https://www.mysite.com permanent;
}
if (!-e $request_filename) {
rewrite ^/(.*) /index.html last;
}
}
}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myserver-myapp-frontend-deployment-v1
spec:
replicas: 1
selector:
matchLabels:
app: myserver-myapp-frontend-v1
template:
metadata:
labels:
app: myserver-myapp-frontend-v1
spec:
containers:
- name: myserver-myapp-frontend-v1
image: harbor.ik8s.cc/baseimages/nginx:1.20.0
ports:
- containerPort: 80
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d/myserver
- name: myserver-tls-key
mountPath: /etc/nginx/conf.d/certs
- name: include-conf
mountPath: /etc/nginx/conf.d
volumes:
- name: nginx-config
configMap:
name: nginx-config
items:
- key: default
path: mysite.conf
- name: myserver-tls-key
secret:
secretName: myserver-tls-key
- name: include-conf
configMap:
name: include-conf
items:
- key: include.conf
path: include.conf
---
apiVersion: v1
kind: Service
metadata:
name: myserver-myapp-frontend-v1
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
nodePort: 31080
protocol: TCP
- name: htts
port: 443
targetPort: 443
nodePort: 31443
protocol: TCP
selector:
app: myserver-myapp-frontend-v1
pod挂载使用configmap时,对应pod内部必须事先不存在对应文件,如果对应文件存在,则对应pod会启不起来;所以我们挂载configmap时指定挂载至/etc/nginx/conf.d即可; 。
应用配置清单,看看使用https访问31443是否可以正常访问?
kubectl create secret docker-registry harbor.ik8s.cc-imagepull \
--docker-server=harbor.ik8s.cc \
--docker-username=admin \
--docker-password=123456
登录harbor,生成config.json文件 使用config.json文件创建secret资源 。
kubectl create secret generic harbor.k8s.cc-registry-image-pull-key \
--from-file=.dockerconfigjson=/root/.docker/config.json \
--type=kubernetes.io/dockerconfigjson
在harbor上将baseimgaes仓库设置为私有仓库 。
验证,使用docker/containerd拉取harbor.k8s.cc/baseimages下的镜像,看看是否可以正常拉取?
可以看到现在更改仓库为私有仓库以后,对应仓库中的镜像不可以正常被拉取 。
验证,使用私有仓库镜像创建pod,看看pod是否能够正常运行起来?
apiVersion: v1
kind: Pod
metadata:
name: "tomcat-demo"
namespace: default
labels:
app: "tomcat-demo"
spec:
containers:
- name: tomcat-demo
image: "harbor.ik8s.cc/baseimages/tomcat:v1"
ports:
- containerPort: 8080
name: http
应用配置清单,看看对应pod是否能够正常跑起来?
可以看到对应pod处于ErrImagePull状态,该状态就是表示pod在创建时,下载镜像错误 。
查看pod详细信息 。
apiVersion: v1
kind: Pod
metadata:
name: "tomcat-demo"
namespace: default
labels:
app: "tomcat-demo"
spec:
containers:
- name: tomcat-demo
image: "harbor.ik8s.cc/baseimages/tomcat:v1"
imagePullPolicy: Always
ports:
- containerPort: 8080
name: http
imagePullSecrets:
- name: harbor.k8s.cc-registry-image-pull-key
spec字段中使用imagePullSecrets字段来引用dockerconfigjson类型的secret资源,使用name字段指定secret的名称即可 。
应用配置清单,看看对应pod是否能够正常跑起来?
可以看到现在对应pod正常跑起来 。
最后此篇关于k8s资源对象(二)的文章就讲到这里了,如果你想了解更多关于k8s资源对象(二)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我的一位教授给了我们一些考试练习题,其中一个问题类似于下面(伪代码): a.setColor(blue); b.setColor(red); a = b; b.setColor(purple); b
我似乎经常使用这个测试 if( object && object !== "null" && object !== "undefined" ){ doSomething(); } 在对象上,我
C# Object/object 是值类型还是引用类型? 我检查过它们可以保留引用,但是这个引用不能用于更改对象。 using System; class MyClass { public s
我在通过 AJAX 发送 json 时遇到问题。 var data = [{"name": "Will", "surname": "Smith", "age": "40"},{"name": "Wil
当我尝试访问我的 View 中的对象 {{result}} 时(我从 Express js 服务器发送该对象),它只显示 [object][object]有谁知道如何获取 JSON 格式的值吗? 这是
我有不同类型的数据(可能是字符串、整数......)。这是一个简单的例子: public static void main(String[] args) { before("one"); }
嗨,我是 json 和 javascript 的新手。 我在这个网站找到了使用json数据作为表格的方法。 我很好奇为什么当我尝试使用 json 数据作为表时,我得到 [Object,Object]
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我听别人说 null == object 比 object == null check 例如: void m1(Object obj ) { if(null == obj) // Is thi
Match 对象 提供了对正则表达式匹配的只读属性的访问。 说明 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的
Class 对象 使用 Class 语句创建的对象。提供了对类的各种事件的访问。 说明 不允许显式地将一个变量声明为 Class 类型。在 VBScript 的上下文中,“类对象”一词指的是用
Folder 对象 提供对文件夹所有属性的访问。 说明 以下代码举例说明如何获得 Folder 对象并查看它的属性: Function ShowDateCreated(f
File 对象 提供对文件的所有属性的访问。 说明 以下代码举例说明如何获得一个 File 对象并查看它的属性: Function ShowDateCreated(fil
Drive 对象 提供对磁盘驱动器或网络共享的属性的访问。 说明 以下代码举例说明如何使用 Drive 对象访问驱动器的属性: Function ShowFreeSpac
FileSystemObject 对象 提供对计算机文件系统的访问。 说明 以下代码举例说明如何使用 FileSystemObject 对象返回一个 TextStream 对象,此对象可以被读
我是 javascript OOP 的新手,我认为这是一个相对基本的问题,但我无法通过搜索网络找到任何帮助。我是否遗漏了什么,或者我只是以错误的方式解决了这个问题? 这是我的示例代码: functio
我可以很容易地创造出很多不同的对象。例如像这样: var myObject = { myFunction: function () { return ""; } };
function Person(fname, lname) { this.fname = fname, this.lname = lname, this.getName = function()
任何人都可以向我解释为什么下面的代码给出 (object, Object) 吗? (console.log(dope) 给出了它应该的内容,但在 JSON.stringify 和 JSON.parse
我正在尝试完成散点图 exercise来自免费代码营。然而,我现在只自己学习了 d3 几个小时,在遵循 lynda.com 的教程后,我一直在尝试确定如何在工具提示中显示特定数据。 This code
我是一名优秀的程序员,十分优秀!