博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用K8S技术栈打造个人私有云(连载之:K8S环境理解和练手)
阅读量:6600 次
发布时间:2019-06-24

本文共 5806 字,大约阅读时间需要 19 分钟。

封面图片


【利用K8S技术栈打造个人私有云系列文章目录】

在前文中我们已经搭建好了K8S集群,接下来就来讲述一下K8S的一些重要的概念和知识,并搞两个例子在集群中来实际练手感受一把!

注: 本文首发于 My 公众号
CodeSheep ,可
长按
扫描 下面的
小心心 来订阅 ↓ ↓ ↓

CodeSheep · 程序羊


K8S环境理解

kubernetes的概念非常多,组件也不少,本文主要阐述一下几个最主要、平时用得最频繁的概念,最详细的学习文档是官网教程!

K8S设计架构

K8S架构

该图描述的设计架构是一个典型的M-S架构,一主两从,这和基本是一致的,主节点和从节点上运行哪些kube组件,其实在我也已经讲过了,下面来阐述一下kubernetes集群里的重要概念和操作命令。

Pod

Pod是Kubernetes中最小的管理元素,Pod是一组容器的集合,且一个Pod只能运行在一个Node上,Pod是kubernetes调度、部署、扩展的基本单位

  • kubectl run命令创建一个pod:kubectl run pod-example --image=nginx
  • kubectl create命令创建pod:kubectl create -f create_pod.yaml
  • 删除pod:kubectl delete po pod名
  • 查看pod启动情况:kubectl get pods kubectl get pods -o wide
  • 查看pod的详细信息:kubectl discrible po pod名

Namespace

Namespace是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的pods, services, replication controllers和deployments等都是属于某一个namespace的(默认是default),而node, persistentVolumes等则不属于任何namespace。

  • 创建 kubectl create namespace namespace名
  • 删除 kubectl delete namespaces namespace名
  • 查询 kubectl get namespaces

Replication Controller(RC)

Replication Controller 保证了在所有时间内,都有特定数量的Pod副本正在运行,如果太多了,Replication Controller就杀死几个,如果太少了,Replication Controller会新建几个,和直接创建的pod不同的是,Replication Controller会替换掉那些删除的或者被终止的pod,而不管删除的原因是什么。

其实其CURD的命令和上面都差不多,这里不一一列出了

  • 创建:kubectl create -f create_rc.json
  • 查看rc启动情况:kubectl get rc

Service

Service 是一个定义了一组Pod的策略的抽象,可以理解为抽象到用户层的一个宏观服务。其实这个概念在里也有,可以参照理解。

Service的这样一层抽象最起码可以抵御两个方面的问题:

  • Pod重启后IP地址的变化(保持用我们系统的客户其IP不变)
  • 提供负载均衡能力

其CURD的命令和上面都差不多,这里依然不一一列出

  • 创建service:kubectr create -f redis-master-service.json
  • 查看service的启动情况:kubectl get svc

这里给一个Service的示例:

apiVersion: v1kind: Servicemetadata:  name: my-nginx-svc  labels:    app: nginxspec:  type: LoadBalancer  ports:  - port: 80  selector:      app: nginx
好了,理论的东西看多了可能有点蒙,只能多找点不同的材料阅读并理解了。下面开始做几个练手示例,这几个例子都源自于 ,对于理解理论概念非常有好处,下面开始动手吧!

关于Pod的实例练手

本例子创建一个包含两个容器的POD,并在容器之间完成文件交换

  • yaml配置文件如下:
apiVersion: v1kind: Podmetadata:  name: two-containersspec:  restartPolicy: Never  volumes:  - name: shared-data    emptyDir: {}  containers:  - name: nginx-container    image: nginx    volumeMounts:    - name: shared-data      mountPath: /usr/share/nginx/html  - name: debian-container    image: debian    volumeMounts:    - name: shared-data      mountPath: /pod-data    command: ["/bin/sh"]    args: ["-c", "echo Hello from the debian container > /pod-data/index.html"]
  • 创建pod

kubectl create -f two-container-pod.yaml

  • 查看pod和容器的信息

kubectl get pod two-containers --output=yaml

执行完成输出内容大致如下(经过缩减):

apiVersion: v1kind: Podmetadata:  ...  name: two-containers  namespace: default  ...spec:  ...  containerStatuses:  - containerID: docker://c1d8abd1 ...    image: debian    ...    lastState:      terminated:  // debian容器已停止        ...    name: debian-container    ...  - containerID: docker://96c1ff2c5bb ...    image: nginx    ...    name: nginx-container    ...    state:      running:  // nginx容器已运行    ...

可以看到debian容器已经停止了,nginx容器依然运行

  • 我们进入nginx容器的/bin/bash并验证nginx服务器

kubectl exec -it two-containers -c nginx-container -- /bin/bash

执行如下命令来安装curl:

root@two-containers:/# apt-get updateroot@two-containers:/# apt-get install curl procpsroot@two-containers:/# ps aux

然后执行curl localhost,可以获得输出:

Hello from the debian container

可见debian容器中写入的东西在nginx容器中获得了,因此文件交换也完成了

用Pod来做一件事很简单吧!


关于RC和Service的实例练手

本示例演示的是:部署一个包含Redis集群、基于PHP的留言板系统

  • 创建redis-master的RC

redis-master-controller.yaml内容:

apiVersion: v1kind: ReplicationControllermetadata:  name: redis-masterspec:  replicas: 1  selector:    name: redis-master  template:    metadata:      name: redis-master      labels:        name: redis-master    spec:      containers:      - name: redis-master        image: kubeguide/redis-master        ports:        - containerPort: 6379

创建该RC并查看创建结果:

kubectl create -f redis-master-controller.yamlkubectl get rckubectl get pods
  • 创建redis-master的service

redis-master-service.yaml内容:

apiVersion: v1kind: Servicemetadata:  name: redis-master  labels:    name: redis-masterspec:  ports:  - port: 6379    targetPort: 6379  selector:    name: redis-master

创建该Service并查看:

kubectl create -f redis-master-service.yamlkubectl get services
  • 创建redis-slave的RC

redis-slave-controller.yaml文件内容:

apiVersion: v1kind: ReplicationControllermetadata:  name: redis-slavespec:  replicas: 2  selector: # RC通过spec.selector来筛选要控制的Pod    name: redis-slave  template:    metadata:      name: redis-slave      labels: # Pod的label,可以看到这个label与spec.selector相同        name: redis-slave    spec:      containers:      - name: redis-slave        image: kubeguide/guestbook-redis-slave        env:        - name: GET_HOSTS_FROM          value: env        ports:        - containerPort: 6379

创建该RC并查看:

kubectl create -f redis-slave-controller.yamlkubectl get rckubectl get pods
  • 创建redis-slave的service

redis-slave-service.yaml文件内容:

apiVersion: v1kind: Servicemetadata:  name: redis-slave  labels:    name: redis-slavespec:  ports:  - port: 6379    selector:    name: redis-slave

创建该Service并查看:

kubectl create -f redis-slave-service.yamlkubectl get services
  • 创建frontend的RC

frontend-controller.yaml内容如下:

apiVersion: v1kind: ReplicationControllermetadata:  name: frontend  labels:    name: frontendspec:  replicas: 3  selector:    name: frontend  template:    metadata:      labels:        name: frontend    spec:      containers:      - name: frontend        image: kubeguide/guestbook-php-frontend        env:        - name: GET_HOSTS_FROM          value: env        ports:        - containerPort: 80

创建该RC并查看

kubectl create -f frontend-controller.yamlkubectl get rckubectl get pods
  • 创建frontend的Service

frontend-service.yaml文件内容如下:

apiVersion: v1kind: Servicemetadata:  name: frontend  labels:    name: frontendspec:  type: NodePort  ports:  - port: 80    nodePort: 30001  selector:    name: frontend

创建该Service并查看

kubectl create -f frontend-service.yamlkubectl get services
  • 访问http://your-host:30001/

浏览器访问结果

简单的留言板系统就生成了!


后记

作者更多的SpringBt实践文章在此:


如果有兴趣,也可以抽点时间看看作者一些关于容器化、微服务化方面的文章:


CodeSheep · 程序羊


转载地址:http://xcmio.baihongyu.com/

你可能感兴趣的文章
Android 6.0 permission 权限适配
查看>>
Wordpress中文章的特色图像Featured Image究竟存在哪里?
查看>>
winform系统自动登录实现
查看>>
MYSQL和INNODB分层实现
查看>>
设计模式——20状态模式(State)
查看>>
[20150225]Delayed Block Cleanout.txt
查看>>
Oracle 内部2,8,10,16进制转换函数包
查看>>
Linux 系统日常管理
查看>>
Facade(外观)模式
查看>>
Python实战:决战虚拟货币市场
查看>>
Oracle AWR管理与维护
查看>>
【具体数学 读书笔记】1.2 Lines in the Plane
查看>>
XSS分析及预防(转)
查看>>
在网页中插入百度地图(实例)
查看>>
Nginx搭建反向代理服务器过程详解(转)
查看>>
如何识别SQL Server中的IO瓶颈
查看>>
Dom4j和Xpath(转)
查看>>
当你在太空中死亡时,你身体会发生什么?
查看>>
Flink如何应对背压问题
查看>>
Findbugs异常总汇
查看>>