关注分享主机优惠活动
国内外VPS云服务器

通往 Docker 和 Kubernetes 容器世界的门户(Docker 容器技术)

步骤

本文使用简单的示例来帮助初学者快速入门DockerKubernetes(K8S)。输入。 通往容器世界的大门。 假设您已经有一个K8S集群。 否则,您可以使用 minikubeminishift 快速设置实验环境。

DockerDockerK8S

Docker 本质上是一种类似于KVMXENVMWARE的虚拟化技术,但它更加轻量级,并且是Docker中的Linux 环境依赖于 Linux 容器技术 (LXC)。 Docker 与传统 KVM 及其他虚拟化技术的区别之一是没有内核。 也就是说,多个 Docker 虚拟机共享一个主机内核。 。 简而言之,Docker 可以被视为无内核虚拟机。 每个Docker虚拟机都有自己的软件环境,并且相互独立。

K8SDocker之间的关系类似于OpenstackKVM之间的关系马苏。 。 从VSphereVMWAREK8S是一个容器集群管理系统。 底层容器虚拟化可以使用Docker技术。 应用人员不需要直接与底层 Docker 节点交互。 您可以通过K8S管理一切。

Docker基础知识

包括:运行 docker run -it --name test-dockervybox /bin/sh 命令并检查其输出,如图所示。 docker 首先在本地搜索名为 busybox图像(Image)1。 。 如果本地没有镜像,可以从docker.io官方镜像库(注册表)启动,下载镜像,保存到本地,并使用这个名为的镜像构建虚拟机。 test-dockerDocker 的正式术语是容器

# docker run -it --name test-dockerbusybox /bin/sh 本地未找到图像“busybox:latest”尝试拉取存储库 docker .io/library/busybox ...最新:从 docker.io/library/busyboxf70adabe43c0 拉取:拉取完整摘要:sha256:186694df7e479d2b8bf075d9e1b1d7a884c6de60470006d572350573bfa6dcd2/ # 

Docker更传统的 KVM VMware 虚拟机更加轻量级,如下图。 test-docker 容器不运行任何其他系统或内核进程,仅docker 运行。 由命令提供/bin/sh进程:

/ # ps -efPID USER TIME COMMAND 1 root 0:00 /bin/sh 7 root 0:00 ps -ef

<em 与 Openstack 相同要在中创建虚拟机,您必须首先将虚拟机映像保存到Glance映像库中。 然后您可以选择一个映像并创建虚拟机。 同样,Docker官方提供了一个共享注册表来存储各种镜像。 例如,此示例使用 busybox 映像创建一个容器,并在本地拉取该映像。 如果您通过运行以下命令进行检查,您会发现它非常轻量,只有大约1MB

# docker image | grep sexyboxdocker.io/busybox 最新 8ac48589692a 5 周前 1.146 MB

通过本节,您将了解 Docker 的三个基础知识 元素我会的。 :映像存储在注册表中,映像包含运行程序所需的软件环境。 ,当您部署容器时,镜像会通过网络拉至Doker主机(节点)

Kubernetes

K8SGoogle的开源容器集群管理系统。 源自Google内部管理系统>Borg,下面我们将通过简单一致的示例帮助初学者熟悉K8S集群。

Pod

K8Spod作为调度和管理的最小单位。 我会。 Docker容器(容器),一个pod可以包含多个容器,同一个pod内的容器共享本地网络。 容器可以通过localhost地址相互访问。 这意味着容器部署在同一主机上,并将pod调度为原子单元意味着: /em> 中的容器被调度到同一个 Docker 节点。

创建一个名为 myhttppod,如下所示。 这包括使用 httpd 映像部署的容器。 容器名称为 myhttp:

# cat > /tmp/myhttpd.pod <<EOFapiVersion: v1kind: Podmetadata: name: myhttp label: app: myhttpspec:containers: [k4 ] name: myhttp image: httpdEOF% kubectl create -f /tmp/myhttpd.pod 

运行 kubectl get pod 命令来确定 Pod 如果成功,确认容器可以提供web服务。

# kubectl get podNAME 就绪状态重新启动 AGEmyhttp 1/1运行 0 1h# kubectl description pod myhttp|grep IPIP: 10.129.0.232#curl 10.129.0.232

有效!

部署

应用程序很少直接以pods的形式部署。 主要原因有: Pod 无法提供弹性伸缩,K8S 也不能。 它被调度到幸存节点,没有自愈能力。 从这个角度来看,应用的部署往往采用镜像(Rc)/Deployment,而在较新版本的K8S中,Deployment来部署一个无状态应用程序,替换Rc

运行kubectl delete pod myhttp来删除pod并将其替换为Deployment来部署。

# cat > myhttp.yaml <<EOF apiVersion:extensions/v1beta1kind:部署元数据:标签:app:myhttp 名称:myhttpspec:replicas:1 选择器:matchLabels:app:myhttp 模板:元数据:标签:应用程序:myhttp 规范:容器:- 图像:httpd 名称:myhttpEOF# kubectl create -f /tmp/myhttp.yaml

Deployment.spec.replicas.spec.replicas 已部署的 Pod 的数量。 例如,此示例当前仅包含一个pod

# kubectl getdeploy,podNAME DESIRED CURRENT UP-TO- DATE AVAILABLE AGEdeploy/ myhttp 1 1 1 1 2mNAME READY STATUS RESTARTS AGEpo/myhttp-7bc6d8b87c-gzlkq 1/1 Running 0 2m

执行kubectl delete pod 删除Pod 然后,Deploy 自动重建 Pod.spec.replicas 我确信它存在。 > Pod em>金额。 这意味着如果pod不健康,部署具有自我修复特性。

# kubectl delete pod myhttp-7bc6d8b87c-gzlkq# kubectl get pod -wNAME 就绪状态重新启动 AGEmyhttp-7bc6d8b87c-dhmtz 0/1 ContainerCreating 0 2smyhttp-7bc6d8b87c-dhmtz 1/1 运行 0 8smyhttp-7bc6d8b87c-gzlkq 1/1 Tertaining 0 8m

需要缩放或何时扩展您的应用程序,如果它以pod的形式部署,您必须删除或创建pod。 另外,如果使用deployment进行部署,则只需要调整.spec.replicas即可。 然后,K8S 镜像控制器会自动调整pods 数量。 扩展 http 应用程序以提供 2,如下所示。

# kubectlscaledeploy/myhttp --replicas=2# kubectl get pod -wNAME 就绪状态重新启动 AGEmyhttp-7bc6d8b87c-cj4g8 0/1 ContainerCreating 0 3smyhttp-7bc6d8b87c -zsbcc 1/1 运行 0 8mmyhttp-7bc6d8b87c-cj4g8 1/1 运行 0 18s# kubectl getdeployNAMEDESIRED CURRENT UP-TO-DATE AVAILABLE AGEmyhttp 2 2 2 21m

运行 kubectl delete pod 来创建 Pod 如果您删除后查看>,您会看到pod名称(即容器主机名)和IP是随机分配的。 那么如何访问应用程序呢?

# kubectl get pod# kubectl description pod myhttp-7bc6d8b87c-cj4g8|grep IPIP: 10.129.3.28

服务

Service 服务包括传统的F5A10以及其他与硬件负载均衡类似的 >K8S以软件方式实现,应用扩展时不需要手动调整,但可以在后端服务器上使用,可以实时跟踪。

内部访问


为您在上一节中部署的 myhttp 应用程序创建一个 service 服务。在后续的service验证中,我们首先创建一个pod作为集群的内部客户端。 Svc 使用 curl 工具进行以下验证,并且官方 centos 镜像包含此工具,因此此镜像运行 > pod 使用 command 来防止 pod 继续运行并终止在前台运行无限循环命令。

# kubectl 创建 -f - <<EOFapiVersion: v1kind: Podmetadata: 名称: myclient 标签: app: myclientspec: 容器: - 名称: myclient 图像: centos 命令: ["sh","-c","while true ; do sleep 3600;ned;"]EOF

通过运行以下命令为 myhttp 应用程序创建 myhttp-int 服务:I将要。 p>

# kubectl 公共部署 myhttp --port=8080 --target-port=80 --name=myhttp-intservice " myhttp- int" selected 

上述命令相当于使用以下 Yaml 文件手动创建服务: is. em>myhttp-int 服务,其8080端口指向后端服务的80端口,后端服务选择器通过(标签)选择标签。 app:myhttppod。 如果您查看myhttp Deployment,您会发现.spec.template.metadata。 .labels 中定义的标签是 app:myhttp。 因此,可以通过myhttp-int:8080访问myhttp服务。

api版本: v1kind: 服务元数据: 标签: 应用程序: myhttp 名称: myhttp-intspec: 集群 IP: 端口: - 端口: 8080 协议: TCP targetPort: 80 选择器: 应用程序: myhttp sessionAffinity: None

当你在测试容器中通过myhttp-int:8080访问服务时,你会看到两个负载均衡的pod。 后端:

# kubectl get podNAME READY STATUS RESTARTS AGEmyclient 1/1 running 0 1hmyhttp-7bc6d8b87c-cj4g8 1/1 running 0 1dmyhttp-7bc6d8b87c[ k4] zsbcc 1/ 1 running 0 1d# 重置Web主页并打印每个Pod名称以便进一步观察# kubectl exec myhttp-7bc6d8b87c-cj4g8 -it -[ k4] sh -c "hostname> htdocs /index .html"# kubectl exec myhttp-7bc6d8b87c-zsbcc -it -- sh -c "主机名>htdocs/index .html"# kubectl exec -it myclient --curl myhttp-int:8080myhttp-7bc6d8b87c-cj4g8# kubectl exec -it myclient --curl myhttp[k4 ] ]int:8080myhttp-7bc6d8b87c-zsbcc

当缩放pod时,服务通过动态跟踪您可以看到命令后端( 端点)服务:

# kubectl get endpoints myhttp-intNAME ENDPOINTS AGEmyhttp-int 10.129.0.237:80,10.129 .3.28:80 1h# kubectl scale deploy myhttp --replicas=3# kubectl get 端点 myhttp-intNAME ENDPOINTS AGEmyhttp-int 10.129.0.237:80,10.129.3.28:80,10.131.0.194 :80 1h

外部访问


如果您的应用程序需要在K8S集群之外提供服务,请使用NodePort您可以创建一个类型为em>的服务目前,K8S集群上的所有节点都通过nodePort指定,外部应用程序可以通过集群中的任意节点访问集群。集群内提供的服务。

# kubectl create -f - <<EOF apiVersion: v1kind: Servicemetadata:labels: app: myhttp name: myhttp-pubspec: type: NodePort ports: - port: 8080节点端口:30001 协议:TCP 目标端口:80 选择器:应用程序:myhttp sessionAffinity:NoneEOF 

通过运行以下命令验证服务并确保服务类型为 ClusterIP确保有。 另一个是 NodePort 类型,但都分配了 ClusterIP 地址:

# kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP端口 (S) AGEmyhttp-int ClusterIP 172.30.37.43  8080/TCP 1hmyhttp-pub NodePort 172.30.6.69  8080:30001/TCP 3m

myhttp[ k4]pubservice通过nodePort在集群中的每个节点上打开一个主机端口。 目前,可以通过集群中的任意节点访问该服务。

#curl 192.168.220.21:30001myhttp-7bc6d8b87c-zsbcc#卷曲 192.168.230.21:30001myhttp-7bc6d8b87c-zsbcc#curl 192.168.240.21:30001myhttp-7bc6d8b87c-cj4g8

通过 NodePort 类型 服务服务可以暴露在集群外,但问题是: 端口数量有限(限制为30000-32767),节点故障后,通过该节点的服务将失败。 。 因此,NodePort 类型的服务并不常用。 相反,使用 Ingress 技术将您的服务公开到集群之外,这样更容易。 出于考虑,本文不讨论 Ingress。

Configmap

如果容器运行状况不佳,镜像控制器会使用镜像来配置容器 重建 em>。 E>. 对容器的这种更改将会丢失。 因此,如果您需要为httpd镜像自定义httpd.conf文件,而不是直接登录到每个容器并更改配置,Configmap em>K8S提供的2技术充当中央存储配置库,创建的文件/em>共享。

为了简单起见,任意创建一个文件,将其挂载到部署上,并将configmap添加到其中,如下所示: 修改和扩展您的部署。 我们将用它来解释Configmap的功能。

创建一个cm3,名为my-config

>


# kubectl create -f - <<EOFapiVersion: v1metadata: name: my-configdata:hosts: | 127.0.0.1 localhost localhost.localdomain #::1 localhost localhost.localdomainkind: ConfigMapEOF

运行kubectl editdeploy myhttp来修改部署并挂载。 将 >cm 移动到 /etc/myhosts 目录。 完整的Yaml文件是(附加:添加volumeMounts):


apiVersion:extensions/v1beta1kind:部署元数据:标签:应用程序:myhttp 名称:myhttpspec:副本:1 选择器:matchLabels:应用程序:myhttp 模板:元数据:标签:应用程序:myhttp 规范:容器:- 图像:httpd 名称: myhttp volumeMounts: - 名称: config-hosts 挂载路径: /etc/myhosts volumes: - name: config-hosts configMap: name: my-config

Deployment 更改以查找 Pod Masu。 > 它将自动重建并检查每个Pod以查找目录中包含cmhosts文件。

# kubectl get podNAME 就绪状态重新启动 AGEmyhttp-774ffbb989-gz6bd 1/1 运行 0 11mmyhttp-774ffbb989-k8m4b 1/1 运行 0 11mmyhttp-774ffbb989[ k4] t74nk 1/1 运行 0 11m# kubectl exec [ k4]it myhttp-774ffbb989-gz6bd -- ls /etc/myhostshosts# kubectl exec -it myhttp-774ffbb989[ k4]gz6bd -- cat /etc/myhosts /hosts127.0.0.1 localhost localhost.localdomain#::1 localhost localhost.localdomain

cm 马苏。 几分钟后,您将找到pod。 设置将自动更新:


# kubectl 编辑 cm my-config...data: 主机: | 127.0.0.1 localhost localhost.localdomain ::1 localhost localhost.localdomain...# kubectl exec -it myhttp-774ffbb989-gz6bd [ k4]- cat /etc/myhosts/hosts127.0.0.1 localhost localhost.localdomain::1 localhost localhost.localdomain

部署应用程序并查看新的pod I将要。 可以看到它包含cm内容。


# kubectlscaledeploy myhttp --replicas=4# kubectl get podmyhttp-774ffbb989-gz6bd 1 /1 运行 0 15hmyhttp-774ffbb989-k8m4b 1 / 1 运行 0 15hmyhttp-774ffbb989-t74nk 1/1 运行 0 15hmyhttp-774ffbb989-z5d6h 1/1 运行 0 21s# kubectl exec -it myhttp-774ffbb989[k4 ]z5d6h [k4 ]- cat /etc/myhosts/hosts127.0.0.1 本地host localhost.localdomain::1 localhost localhost.localdomain

Secret

Configmap 比较并保存使用。 纯文本。 然后Secret存储密文,例如用户密码和其他敏感数据。 这些可以使用Secrets加密存储。 创建一个秘密来加密用户和密码并将其提供给容器,如下所示。

opaque秘密数据是map类型并且需要base64编码。 加密用户和密码:


# echo -n root | base64cm9vdA==# echo -n Changeme | base64Q2hhbmdlbWU=

加密用户和密码创建文件名为Secret,包含userpwd -secret


# kubectl create -f - <<EOFapiVersion: v1kind: Secretmetadata: name: userpwd-secrettype: Opaquedata: 用户名: cm9vdA== 密码: Q2hhbmdlbWU=EOF


# pre>

更新部署并以模式将secret挂载到容器中:


# kubectl editdeployment myhttp..spec:... 规范:容器:- 图像:httpd ...volumeMounts:- 名称:userpwd 挂载路径:/etc/mysecret ... 卷:- 名称:userpwd 秘密:SecretName:userpwd-secret...

当你登录容器时,你会看到secretkey被保存为一个文件,其内容就是value 。 em> 但正确的解密正在发生:


# kubectl exec -it myhttp-64575c77c-kqdj9 -- ls - l /etc/ My秘密lrwxrwxrwx。   1 root root 15 May 17 07:01 密码 -> ..data/passwordlrwxrwxrwx。   1 root root 15 May 17 07:01 用户名 -> ..data/username# kubectl exec -it myhttp-64575c77c-kqdj9 -- cat /etc/mysecret/usernameroot 

存储

Web 将应用程序保存到外部存储并将其安装在pod上。 > 无论pod是否重建或扩展,您发布的应用程序都不会丢失。

NFS 配置存储

为简单起见,此示例使用NFS作为共享存储:

nfs 服务器安装软件:

# yum install nfs-utils 

共享目录配置:

# mkdir -p /exports/httpd# chmod 0777 /exports/*# chown nfsnobody:nfsnobody /exports/*# cat > /etc /exports.d /k8s.exports <<EOF/exports/httpd *(rw,root_squash)EOF

配置防火墙允许 nfs 端口:

#firewall -cmd --add-port=2049/tcp#firewall-cmd --永久--add-port=2049/tcp

配置Selinux,以便Docker可以将数据写入nfs

# getsebool -a| grep virt_use_nfs#setsebool -P virt_use_nfs=true

nfs 启动服务。

# systemctl restart nfs-config# systemctl restart nfs[ k4]server# systemctl Enable nfs-server

K8S集群将使用

K8S集群为每个节点安装nfs客户端软件并添加Selinux设置权限。

#yum install nfs-utils#setsebool -P virt_use_nfs=true

创建

nfs 类型的持久卷:持久卷 (PV) ,指的是nfs后端存储:

# kubectl create -f - <<EOFapiVersion: v1kind: Persistent Volumemetadata: name: httpdspec: accessModes: [k4 ] ReadWriteMany 容量:存储:1Gi nfs:路径:/exports/httpd 服务器:192.168.240.11persistentVolumeReclaimPolicy:RetainEOF

持久卷声明指向上一步创建的PersistentVolumeClaim (PVC)PV:

# kubectl create -f - <<EOFapiVersion: v1kind: PersistentVolumeClaimmetadata: name: httpdspec: accessModes: - ReadWriteMany 资源: 请求: 存储: 1Gi 卷名称:httpdEOF

检查显示 pvc/httpd 绑定到 pv/httpd

# oc get pv , pvcNAME容量访问方式S RECLAIM 策略状态声明 ... pv/httpd 1Gi RWX 保留绑定演示/httpd ...名称状态卷容量访问模式存储类 AGEpvc/httpd 绑定 httpd 1Gi RWX 53s

重建部署 em>,添加挂载挂载点:

# kubectl linkedeploy myhttp# kubectl create -f - <<EOFapiVersion : 扩展/v1beta1kind:部署元数据:标签:应用程序:myhttp 名称:myhttpspec:副本:3 选择器:matchLabels:应用程序:myhttp 模板:元数据:标签:应用程序:myhttp 规范:容器:- 图像:httpd 名称:myhttp imagePullPolicy:IfNotPresent VolumeMounts: - 名称: config-hosts mountPath: /etc/myhosts - 名称: userpwd 挂载路径: /etc/mysecret - 名称: httpd-htdocs 挂载路径: /usr/local/apache2/htdocs 卷: - 名称: config[k4 ]hosts configMap: 名称: my-config - 名称: userpwd 秘密: SecretName: userpwd-secret - 名称: httpd-htdocspersistentVolumeClaim:claimName: httpdEOF

Pod 生成后,请确保容器中挂载了 nfs 目录:

# kubectl get pod# kubectl exec -it myhttp[ k4]8699b7d498 -dlzrm -- df -h文件系统大小已使用可用使用%安装在...192.168.240.11:/exports/httpd 37G 17G 21G 44% /usr/local/apache2/htdocs ..# kubectl exec -it myhttp-8699b7d498-dlzrm -- ls htdocs # 当前目录为空

登录到任意容器并将您的Web应用程序发布到htdocs目录。

 # kubectl exec -it myhttp-8699b7d498-dlzrm -- /bin/sh# echo "这是对 pv 的测试" > htdocs/index.html #在容器内部

然后,您可以删除或部署容器,并查看容器内的 htdocs 包含已发布的应用程序。

# kubectl delete pod -l app=myhttp # 删除所有 myhttp pod# kubectl get pod #等待 pod 重建# kubectl exec -it myhttp -8699b7d498-6q8tv -- cat htdocs/index.html这是对 pv 的测试

Satefulset

例如,上面的 myhttpPod 的 Deplyment 创建的 em> 应用程序可以共享和挂载相同的存储()。 但是,如果Kafaka em>集群和Zookeeper集群是有状态的,并且每个集群都需要将主机名确定为一个并挂载存储。 考虑到这一点,K8S 提供Satefulse。满足此类应用需求的技术。

使用 nginx 映像创建一个有状态集群,并使用它来演示 Statefulset 的用法,如下所示。

部署不同,您必须首先使用ClusterIP:None创建一个服务

 # kubectl create -f - <<EOFapiVersion: v1kind: Servicemetadata: name: Web label: app: nginx-webspec: ports: - port: 80 name: Web cluster IP: None 选择器: app: nginx -webEOF

服务没有ClusterIP。 这意味着无法通过thisServcie.

# kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEweb ClusterIP None  80/TCP 3s

创建名称 nginx 有状态服务,镜像数量为2。 请注意,ServiceName 设置为在上一步中创建的 Svc

# kubectl create [ k4]f - <<EOFapiVersion: apps/v1beta1kind: StatefulSetmetadata: 名称: nginxspec: serviceName: web 副本: 2 模板: 元数据: 标签: app: nginx-web 规范: 容器: - 名称: nginx 镜像: nginx 端口: - 容器端口: 80 名称: webEOF

如果您观察pod启动,您将看到pod名称的格式为nginx-n 可以看到4,这个名字是固定且唯一的,可以看到pods是按顺序启动的。 即容器nginx-n是在nginx中的-之后启动的。

# kubectl get pod -wNAME 就绪状态重新启动 AGEnginx-0 0/1 ContainerCreating 0 7snginx-0 1/1 正在运行 0 10snginx-1 0/1 待处理 0 0snginx[ k4]1 0/1 待定ing 0 0snginx-1 0/1 ContainerCreating 0 1snginx-1 1/1 Running 0 13s

创建的服务是一个有状态集使用者 > 跟踪 DNS 上的 pod 名称:

# kubectl run -i -- tty -[k4 ]image Busybox dns-test --restart=Never --rm /bin/sh# 接下来的操作是重启,新创建的 dns-test pod 就会被执行。  # nslookup web # 找到Web服务,可以看到后端有两个Pod... Name: webAddress 1: 10.129.0.248 nginx-0.web.demo.svc.cluster.localAddress 2: 10.131 . 0.200 nginx-1。   web.demo.svc .cluster.local# nslookup nginx-0.web # 查看 pod 名称对应的 IP 地址...name: nginx-0.web.demo.svc.cluster.localAddress 1: 10.129.0.248 nginx- 0.web.demo.svc.cluster.local# nslookup nginx-1.web...名称:nginx-1.web.demo.svc.cluster.local地址 1:10.131.0.200 nginx-1.web.demo.svc.cluster.local

配置satefulset挂载

# kubectl delete statefulset nginx # 为了简单起见,删除上面创建的statefulset# kubectl create [k4 ]f - << EOFapiVersion:apps / v1beta1kind:StatefulSetmetadata:名称:nginxspec:serviceName:Web副本:2模板:元数据:标签:app:nginx-Web规范:容器:-名称:nginx图像:nginx端口:-容器端口:80 名称:Web volumeMounts:- 名称:www 挂载路径:/usr/share/nginx/html volumeClaimTemplates:- 元数据:名称:www 规范:accessModes:[ " ReadWriteOnce" ] storageClassName:glusterfs-突袭0esources:requests:storage:10MiEOF

注意:添加到volumeClaimTemplates.spec中的storageClassName被命名为glusterfs-raid0 导致 k8s 在生成 pods 时使用动态配置 它将变得像这。 5 创建PVC、PV并自动从存储池glusterfs-raid0动态分配。 当然,如果您想使用在Storage部分中配置的nfs存储,请在此处删除storageClassName,然后使用Storage您必须创建手动指定类名。 存储、光伏、聚氯乙烯。

验证:

# k8s 使用动态配置从 glusterfs 自动创建以下卷: # kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEwww-nginx-0绑定 pvc-4a76e4a9... 1Gi RWO glusterfs-raid0 22hwww-nginx-1 绑定 pvc-536e8980... 1Gi RWO glusterfs -raid0 22h# kubectlget statefulset,podNAME DESIRED CURRENT AGEstatefulsets/nginx 2 2 22hNAME READY STATUS RESTARTS AGEpo/nginx-0 1/1 running 0 22hpo/nginx-1 1/1 running 0 22h# 两个 Pod 挂载其卷:# kubectl exec -it nginx-0 -- df -h 文件系统使用大小 Avail Use% Mounted on 192.168.220.21:vol_e6858... 1016M 33M 983M 4% /usr/share/nginx/html # kubectl exec -it nginx-1 -- df -h 使用的文件系统大小 Avail Use% Mounted on 192.168.220.21:vol_c659cc... 1016M 33M 983M 4% /usr/share/nginx/ html

命名空间

细心的读者应该参考存储部分。 demo/httpd,这个demo是作者使用的命名空间/项目6。 正如Openstack云计算平台提供多租户,每个租户都可以创建自己的项目K8S也提供租户功能。 ,你可以创建各种命名空间并组合上面的podsservicesconfigmaps等即可。 受命名空间限制。

新建的K8S集群默认有两个命名空间

# kubectl get namespaceNAME DISPLAY NAME STATUSdefault Active # 默认命名空间kube-system Active # k8s 本身使用的命名空间

可以通过运行以下命令创建命名空间:

# kubectl create namespace Demonamespace "demo " created

这将导致可以包含 -n ” 参数。 查询pod,如下所示。

# kubectl 获取pod -n DemonNAME READY STATUS RESTARTS AGEnginx-0 1/1 running 0 23hnginx-1 1/1 running 0 23h

最后,关于Openshift。 platform ,您可以通过运行以下命令登录命名空间,这样您就不必每次都包含“-n ”:

# oc project demo# oc get podNAME READY STATUS RESTARTS AGEnginx-0 1/1 Running 0 23hnginx-1 1/1 Running 0 23h

结论

通过本文,您学习了DockerK8S的核心知识。 相信读者应该能够很好的使用K8S平台。


图像的格式为:。 如果不指定image_tag,则默认为最新标签

参见官方文档:使用ConfigMap配置pod。 ↩

内容是键:值。格式,一个 cm 可以包含多个 ↩

statefulset名称的生成规则是固定的:- n

存储可以是动态的,比如glusterfs存储必须是动态的。支持配置。 为了支持动态配置,必须配置heketi。 ↩

Openshift 平台,其项目K8S命名空间

未经允许不得转载:主机频道 » 通往 Docker 和 Kubernetes 容器世界的门户(Docker 容器技术)

相关推荐

评论 抢沙发

评论前必须登录!

 

本站不销售/不代购主机产品,不提供技术支持,仅出于个人爱好分享优惠信息,请遵纪守法文明上网

Copyright © 主机频道 - ZHUJIPINDAO.COM ,本站托管于国外主机商

© 2021-2024   主机频道   网站地图 琼ICP备2022006744号