步骤
本文使用简单的示例来帮助初学者快速入门Docker和Kubernetes(K8S)。输入。 通往容器世界的大门。 假设您已经有一个K8S集群。 否则,您可以使用 minikube 或 minishift 快速设置实验环境。
DockerDocker 和 K8S
Docker 本质上是一种类似于KVM、XEN和VMWARE的虚拟化技术,但它更加轻量级,并且是Docker中的Linux 环境依赖于 Linux 容器技术 (LXC)。 Docker 与传统 KVM 及其他虚拟化技术的区别之一是没有内核。 也就是说,多个 Docker 虚拟机共享一个主机内核。 。 简而言之,Docker 可以被视为无内核虚拟机。 每个Docker虚拟机都有自己的软件环境,并且相互独立。
K8S和Docker之间的关系类似于Openstack和KVM之间的关系马苏。 。 从VSphere到VMWARE。 K8S是一个容器集群管理系统。 底层容器虚拟化可以使用Docker技术。 应用人员不需要直接与底层 Docker 节点交互。 您可以通过K8S管理一切。
Docker基础知识
包括:运行 docker run -it --name test-dockervybox /bin/sh 命令并检查其输出,如图所示。 docker 首先在本地搜索名为 busybox 的图像(Image)1。 。 如果本地没有镜像,可以从docker.io官方镜像库(注册表)启动,下载镜像,保存到本地,并使用这个名为的镜像构建虚拟机。 test-docker 和 Docker 的正式术语是容器。
# 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
K8S是Google的开源容器集群管理系统。 源自Google内部管理系统>Borg,下面我们将通过简单一致的示例帮助初学者熟悉K8S集群。
Pod
K8S以pod作为调度和管理的最小单位。 我会。 Docker容器(容器),一个pod可以包含多个容器,同一个pod内的容器共享本地网络。 容器可以通过localhost地址相互访问。 这意味着容器部署在同一主机上,并将pod调度为原子单元意味着: /em> 中的容器被调度到同一个 Docker 节点。
创建一个名为 myhttp 的 pod,如下所示。 这包括使用 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.yamlDeployment 的 .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 服务包括传统的F5、A10以及其他与硬件负载均衡类似的 >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:myhttp 的 pod。 如果您查看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 3mmyhttp[ 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-configDeployment 更改以查找 Pod Masu。 > 它将自动重建并检查每个Pod以查找目录中包含cm的hosts文件。
# 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.localdomaincm 马苏。 几分钟后,您将找到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.localdomainSecret
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...当你登录容器时,你会看到secret的key被保存为一个文件,其内容就是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=truenfs 启动服务。
# systemctl restart nfs-config# systemctl restart nfs[ k4]server# systemctl Enable nfs-serverK8S集群将使用
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: httpdEOFPod 生成后,请确保容器中挂载了 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也提供租户功能。 ,你可以创建各种命名空间并组合上面的pods、services、configmaps等即可。 受命名空间限制。
新建的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结论
通过本文,您学习了Docker和K8S的核心知识。 相信读者应该能够很好的使用K8S平台。
图像的格式为:。 如果不指定image_tag,则默认为最新标签 ↩
参见官方文档:使用ConfigMap配置pod。 ↩
内容是键:值。格式,一个 cm 可以包含多个 ↩
。 statefulset名称的生成规则是固定的:- n ↩
存储可以是动态的,比如glusterfs存储必须是动态的。支持配置。 为了支持动态配置,必须配置heketi。 ↩
Openshift 平台,其项目是K8S 的命名空间 ↩
评论前必须登录!
注册