利用k8s技术栈打造个人私有云(连载之:k8s环境理解和练手)(代码片段)

author author     2022-11-02     719

关键词:

技术分享图片


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

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


K8S环境理解

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

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 podskubectl 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的策略的抽象,可以理解为抽象到用户层的一个宏观服务。其实这个概念在Swarm集群里也有,可以参照理解。

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

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

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

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

这里给一个Service的示例:

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:  
    app: nginx

好了,理论的东西看多了可能有点蒙,只能多找点不同的材料阅读并理解了。下面开始做几个练手示例,这几个例子都源自于K8S官网,对于理解理论概念非常有好处,下面开始动手吧!


关于Pod的实例练手

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

  • yaml配置文件如下:

    apiVersion: v1
    kind: Pod
    metadata:
    name: two-containers
    spec:
    
    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: v1
kind: Pod
metadata:
  ...
  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:

[email protected]:/# apt-get update
[email protected]:/# apt-get install curl procps
[email protected]:/# ps aux

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

Hello from the debian container

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

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


关于RC和Service的实例练手

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

  • 创建redis-master的RC

redis-master-controller.yaml内容:

apiVersion: v1
kind: ReplicationController
metadata:
  name: redis-master
spec:
  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.yaml
kubectl get rc
kubectl get pods
  • 创建redis-master的service

redis-master-service.yaml内容:

apiVersion: v1
kind: Service
metadata:
  name: redis-master
  labels:
    name: redis-master
spec:
  ports:
  - port: 6379
    targetPort: 6379
  selector:
    name: redis-master

创建该Service并查看:

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

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

apiVersion: v1
kind: ReplicationController
metadata:
  name: redis-slave
spec:
  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.yaml
kubectl get rc
kubectl get pods
  • 创建redis-slave的service

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

apiVersion: v1
kind: Service
metadata:
  name: redis-slave
  labels:
    name: redis-slave
spec:
  ports:
  - port: 6379  
  selector:
    name: redis-slave

创建该Service并查看:

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

frontend-controller.yaml内容如下:

apiVersion: v1
kind: ReplicationController
metadata:
  name: frontend
  labels:
    name: frontend
spec:
  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.yaml
kubectl get rc
kubectl get pods
  • 创建frontend的Service

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

apiVersion: v1
kind: Service
metadata:
  name: frontend
  labels:
    name: frontend
spec:
  type: NodePort
  ports:
  - port: 80
    nodePort: 30001
  selector:
    name: frontend

创建该Service并查看

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

技术分享图片

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


后记

作者更多的原创文章在51CTO


云原生之kubernetes实战在k8s环境下部署homepage个人导航页

【云原生之kubernetes实战】在k8s环境下部署Homepage个人导航页一、Homepage简介二、检查本地k8s环境1.检查工作节点状态2.检查系统pod状态三、安装docker-compose工具1.下载docker-compose二进制包2.给文件增加执行权限3.检查docker-compose版本四... 查看详情

9.docker私有仓库搭建(k8s连载)(代码片段)

环境:有一个集群,里面有三台服务器master:192.168.1.106nodes1:192.168.1.104nodes2:192.168.1.105 操作系统:使用的MacOS,windows同样有效 一.docker的Registry的安装和配置选择将nodes1作为镜像仓库. 1.在node节点上,获取并安装registry镜像dockerp... 查看详情

云原生之kubernetes实战使用sealos部署k8s集群环境

...Sealos介绍1.Sealos简介2.Sealos特性3.Sealos图示二、本地k8s节点环境1.节点规划2.节点系统版本三、下载Sealos工具包四、初始环境配置1.关闭防火墙和selinux2.配置host文件解析3.配置时间同步五、k8s各节点卸载原有docker六、部署k8s集群1.解... 查看详情

云原生之kubernetes实战使用sealos部署k8s集群环境

...Sealos介绍1.Sealos简介2.Sealos特性3.Sealos图示二、本地k8s节点环境1.节点规划2.节点系统版本三、下载Sealos工具包四、初始环境配置1.关闭防火墙和selinux2.配置host文件解析3.配置时间同步五、k8s各节点卸载原有docker六、部署k8s集群1.解... 查看详情

云原生之kubernetes实战在k8s环境下部署kubegems云管理平台

【云原生之kubernetes实战】在k8s环境下部署KubeGems云管理平台一、KubeGems介绍1.KubeGems简介2.KubeGems特点3.KubeGems产品生态二、检查本地k8s环境1.检查工作节点状态2.检查系统pod状态三、安装KubeGemsInstaller控制器1.KubeGemsInstaller介绍2.创建... 查看详情

k8s-私有云镜像库使用

参考技术Ak8s集群环境安装完毕,创建pod时报错repositorydoesnotexistormayrequire'dockerlogin',node节点已经登录过docker镜像库、可以正常拉取镜像,k8s调度就不行!私有镜像库需要添加imagePullSecrets:---其实就是给k8s创建一个连接私有... 查看详情

云原生之kubernetes实战在k8s集群环境下部署tomcat应用

【云原生之kubernetes实战】在k8s集群环境下部署Tomcat应用一、检查本k8s集群环境1.检查k8s版本2.检查工作节点系统版本二、检查k8s集群状态1.检查工作节点状态2.检查系统pod状态三、部署mysql服务1.编辑mysql.yaml2.应用mysql.yaml3.查看pod... 查看详情

云原生之kubernetes实战在k8s环境下部署kubegems云管理平台

【云原生之kubernetes实战】在k8s环境下部署KubeGems云管理平台一、KubeGems介绍1.KubeGems简介2.KubeGems特点3.KubeGems产品生态二、检查本地k8s环境1.检查工作节点状态2.检查系统pod状态三、安装KubeGemsInstaller控制器1.KubeGemsInstaller介绍2.创建... 查看详情

云原生之kubernetes实战在k8s环境下部署leanote蚂蚁笔记工具

【云原生之kubernetes实战】在k8s环境下部署Leanote蚂蚁笔记工具一、Leanote蚂蚁笔记介绍1.Leanote简介2.Leanote的特点二、检查k8s环境1.检查工作节点状态2.检查k8s版本3.检查系统pod状态三、Leanote镜像下载1.Leanote镜像版本介绍2..Leanote的数... 查看详情

k8s云平台环境调优说明

...线过程中遇到了服务器性能瓶颈,需要优化调整,使性能利用率最大化,在多次反复优化配置验证后,最终达到客户要求的测试标准。本篇文档主要介绍K8S部署成功后环境调优的配置步骤。 1整体介绍 环境调优主要包含... 查看详情

云原生之kubernetes实战在k8s环境下部署filebrowser文件管理平台

【云原生之kubernetes实战】在k8s环境下部署FileBrowser文件管理平台一、FileBrowser介绍1.FileBrowser简介2.FileBrowser功能二、检查本地k8s环境1.检查工作节点状态2.检查系统pod状态三、安装kompose工具1.下载Kompose软件包2.给二进制文件设置执... 查看详情

云原生之kubernetes实战在k8s环境下部署jpress开源网站

【云原生之kubernetes实战】在k8s环境下部署jpress开源网站一、jpress介绍1.jpress简介2.jpress功能二、检查本地k8s环境1.检查工作节点状态2.检查系统pod状态三、编辑jpress.yaml文件1.创建安装目录2.编辑jpress.yaml文件四、部署jpress应用1.应... 查看详情

云原生之kubernetes实战在k8s环境下部署laverna笔记工具

【云原生之kubernetes实战】在k8s环境下部署Laverna笔记工具一、Laverna介绍1.Laverna简介2.Laverna特点二、检查本地k8s环境1.检查工作节点状态及k8s版本2.检查系统pod状态三、编辑laverna.yaml文件1.创建安装目录2.编辑laverna.yaml文件四、部署L... 查看详情

云原生之kubernetes实战使用kubeadm部署k8s集群环境

【【云原生之kubernetes实战】使用kubeadm部署k8s集群环境一、环境规划1.节点系统版本2.集群节点IP规划二、安装docker1.安装docker2.启动docker服务3.开启路由转发4.设置镜像加速5.重启docker服务6.卸载docker方法(补充可选)三、环境配置1... 查看详情

云原生之kubernetes实战在k8s环境下部署discuz论坛系统

【云原生之kubernetes实战】在k8s环境下部署Discuz论坛系统一、Discuz介绍二、检查本地k8s环境1.检查工作节点状态2.检查系统pod状态三、部署mysql服务1.编辑mysql.yaml2.创建mysql应用3.查看pod状态4.查看service状态四、部署Discuz1.编辑discuz.ya... 查看详情

云原生之kubernetes实战在k8s环境下部署teleport堡垒机系统

【云原生之kubernetes实战】在k8s环境下部署Teleport堡垒机系统一、Teleport介绍1.Teleport介绍2.本次实践说明二、检查本地k8s环境1.检查工作节点状态2.检查系统pod状态三、使用docker部署Teleport方法四、编辑teleport.yaml五、部署Teleport应用1... 查看详情

9.docker私有仓库搭建(k8s连载)(代码片段)

环境:有一个集群,里面有三台服务器master:192.168.1.106nodes1:192.168.1.104nodes2:192.168.1.105 操作系统:使用的MacOS,windows同样有效 一.docker的Registry的安装和配置选择将nodes1作为镜像仓库. 1.在node节点上,获取并安装registry镜像dockerp... 查看详情

云原生之kubernetes实战在k8s环境下部署affine知识库工具

【云原生之kubernetes实战】在k8s环境下部署Affine知识库工具一、Affine介绍二、检查本地k8s环境1.检查工作节点状态2.检查系统pod状态3.检查kubectl版本及系统版本三、编辑affine.yaml文件四、部署Affine1.应用affine.yaml文件2.查看pod详细信... 查看详情