76: kubernetes 服务管理、kubernetes 存储卷、kubernetes 发布服务ingress、总结和答疑

Top

NSD CLOUD DAY09

  1. 案例1:编写service资源文件(一)
  2. 案例2:编写service资源文件(二)
  3. 案例3:对外发布服务
  4. 案例4:configMap练习
  5. 案例5:网络存储卷应用案例
  6. 案例6:课外实验(微服务web集群实战)

1 案例1:编写service资源文件(一)

1.1 问题

本案例要求学习service资源文件,具体要求如下:

  1. 创建service服务,访问后端apache
  2. 测试负载均衡
  3. Headless 服务

1.2 方案

注意事项:

今日课程所用到的案例需要依赖前面docker课程中制作的镜像,必须将前面课程中的镜像全部导入到私有仓库(192.168.1.100服务器),镜像列表如下:

busybox:latest

myos:v1804

myos:httpd

myos:php-fpm

myos:nginx

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:创建service资源(在master主机操作)

1)创建2副本的Web服务容器

资源文件已经共享在云盘第四阶段kubernetes/v1.17.6/config/apache-example.yaml,各位同学需要提前下载至自己的master主机。

使用资源文件创建一个多部分的容器环境,默认多副本会自动分配到不同的主机上运行。

[root@master ~]# kubectl  apply -f apache-example.yaml          #创建资源
deployment.apps/apache-example created

[root@master ~]# kubectl get pod -o wide #查看创建的资源
NAME READY STATUS RESTARTS AGE IP NODE
apache-56d75cb55c-njqwj 1/1 Running 0 1m 10.254.68.2 node-0003
apache-56d75cb55c-wf6zt 1/1 Running 0 1m 10.254.39.2 node-0001

2)删除一个pod,观察变化


当发现某一个pod不能使用的时候RS会在其他机器上在创建一个相同的pod,及其对应的容器。


[root@master ~]# kubectl get pod -o wide        #查看容器运行在哪台主机上
NAME READY STATUS RESTARTS AGE IP NODE
apache-56d75cb55c-ld5jp 1/1 Running 0 5m 10.254.68.3 kube-node3
apache-56d75cb55c-wf6zt 1/1 Running 0 7m 10.254.39.2 kube-node1

[root@master ~]# kubectl delete pod web-56d75cb55c-ld5jp
pod “web-56d75cb55c-ld5jp” deleted
#删除其中一个容器(容器名称不能照抄,根据上面查询到的结果删除)

[root@master ~]# kubectl get pod -o wide #删除后再次观察,容器被重建了
NAME READY STATUS RESTARTS AGE IP NODE
apache-56d75cb55c-7q9fv 1/1 Running 0 8s 10.254.55.2 kube-node2
apache-56d75cb55c-wf6zt 1/1 Running 0 7m 10.254.39.2 kube-node1

3)service


因为容器随时都也被重建,其IP地址也跟着随机变化,我们如何访问容器呢?


service就是解决这一个问题的方法,service会创建一个cluster ip,service总能找到对应的 pod,且 cluster ip保持不变,如果有pod对应多个容器,service 会自动在多个容器间实现负载均衡。


创建service的资源文件已经共享在云盘第四阶段kubernetes/v1.17.6/config/service-example.yaml,各位同学提前下载该资源文件。


[root@master ~]# cat service-example.yaml               #查看资源文件

apiVersion: v1
kind: Service # 定义资源类型
metadata:
name: apache-service # 服务的名字
spec: # 服务详细信息
ports: # 端口定义

  • protocol: TCP # 协议
    port: 80 # 开放在前端的访问端口
    targetPort: 80 # 目标主机端口
    selector: # 选择为那个 deployment 提供服务(后端)
    app: myapache # 通过标签指定后端
    type: ClusterIP # 服务类型

[root@master ~]# kubectl apply -f service-example.yaml #创建资源
[root@master ~]# kubectl get service
#查看service资源,查看资源信息可以获得一个随机的Cluster IP(集群IP)

4)验证效果


Service提供的集群IP,仅可以在集群内可以直接访问服务,但集群外无法访问服务。


下面测试访问使用的集群IP是随机的,不能照抄!!!


[root@localhost ~]# curl -m 2 http://10.254.146.37/   	# 在跳板机上无法访问服务
curl: (28) Connection timed out after 2000 milliseconds

10.254.146.37是service提供的集群IP

[root@master ~]# kubectl run test -i -t --image=192.168.1.100:5000/myos:v1804

启动容器,等会在容器里面测试service提供的集群IP

[root@myos /]# curl -m 2 http://10.254.146.37/ # 在集群内使用curl可以访问服务
<pre>
hello world
hello world
hello world
[root@myos /]#

步骤二:创建handless资源(在master主机操作)


资源文件已经共享在云盘第四阶段kubernetes/v1.17.6/config/service-example.yaml,各位同学提前下载该资源文件,并需要修改该文件的内容。


[root@master ~]# vim service-example.yaml       # 手工修改该文件

apiVersion: v1
kind: Service
metadata:
name: apache-service
spec:
ports:

  • protocol: TCP
    port: 80
    targetPort: 80
    selector:
    app: myapache
    type: ClusterIP
    clusterIP: None # 在文件末尾手动添加这一行,设置为 None
    [root@master ~]# kubectl apply -f service-example.yaml #创建资源

[root@myos ~]# dig -t all hl-service.default.svc.cluster.local
… …
;; ANSWER SECTION:
hl-service.default.svc.cluster.local. 30 IN A 10.244.1.41
hl-service.default.svc.cluster.local. 30 IN A 10.244.6.34



2 案例2:编写service资源文件(二)


2.1 问题


本案例要求创建 nodePort 服务,具体要求如下:



  1. 创建nodeport服务,并从集群外部测试访问效果



2.2 步骤


实现此案例需要按照如下步骤进行。


步骤一:创建nodeport服务(在master主机操作)


资源文件已经共享在云盘第四阶段kubernetes/v1.17.6/config/service-example.yaml,各位同学提前下载该资源文件,并需要修改该文件的内容。


[root@master ~]# vim service-example.yaml       # 手动修改该文件

apiVersion: v1
kind: Service
metadata:
name: apache-service2
spec:
ports:

  • protocol: TCP
    port: 80
    targetPort: 80
    selector:
    app: myapache
    type: nodePort # 在文件末尾修改类型为 nodePort
    [root@master ~]# kubectl apply -f service-example.yaml #创建资源

    一旦将service映射为node节点的端口后,我们就可以在任意节点访问容器服务。

    [root@master ~]# kubectl  get  service  web-service  -o  wide
    

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
web-service NodePort 10.254.232.91 <none> 80:32362/TCP 11s run=apache
#查看service资源的IP和端口(注意看端口号)

[root@master ~]# curl http://node-0001:32362

node-0001 已经在 /etc/hosts 中配置解析

在master、node-0001、node-0002等所有节点主机都可以访问容器服务

3 案例3:对外发布服务

3.1 问题

本案例主要练习ingress控制器,分别实现以下目标:

  1. 安装配置ingress控制器
  2. 通过ingress向外发布服务

3.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:安装ingress控制器(在master主机操作操作)

ingress控制器对应的镜像文件已经共享在云盘第四阶段kubernetes/v1.17.6/ingress/ingress-nginx.tar.gz。各位同学需要提前下载。

1) 首先需要将ingress镜像上传至私有镜像仓库(192.168.1.100服务器)

[root@master ~]# docker load -i ingress-nginx.tar.gz
[root@master ~]# docker tag  quay.io/kubernetes-ingress-controller/nginx-ingress-controller  192.168.1.100:5000/nginx-ingress-controller:0.30.0
[root@master ~]# docker push 192.168.1.100:5000/nginx-ingress-controller:0.30.0

2) 验证仓库

[root@master ~]#curl http://192.168.1.100:5000/v2/nginx-ingress-controller/tags/list
{"name":"nginx-ingress-controller","tags":["0.30.0"]}

[root@master ~]# kubectl apply -f httpd-example-v1.yaml
deployment.apps/web-example configured

3) 创建ingress资源


资源文件已经共享在云盘第四阶段kubernetes/v1.17.6/ingress/目录下,各位同学需要自行下载该资源文件,并需要修改该文件才可以使用。


修改资源文件mandatory.yaml,指定启动ingress容器时应该从私有仓库下载镜像,而默认指定的是官网。


[root@master ~]# vim ingress/mandatory.yaml            #修改镜像文件image的路径
221: image: 192.168.1.100:5000/nginx-ingress-controller:0.30.0

[root@master ~]# kubectl create -f ingress/mandatory.yaml #创建资源
namespace/ingress-nginx created

[root@master ~]# kubectl -n ingress-nginx get pod #查看资源
NAME READY STATUS RESTARTS AGE
nginx-ingress-controller-fc6766d7-xtsp2 1/1 Running 0 50m

步骤二:通过ingress对外发布容器服务(在master主机操作操作)


1)创建资源,通过ingress映射内部服务


[root@master ~]# vim  ingress-example.yaml

apiVersion: extensions/v1beta1
kind: Ingress # 资源对象类型
metadata:
name: my-app # ingress 资源名称
annotations:
kubernetes.io/ingress.class: “nginx”
spec:
backend: # 后端服务
serviceName: apache-service # service 名称,需要查看之前实验创建的名称
servicePort: 80 # 服务端口号,是服务的 Port

#注意:这里的apache-service是前面实验创建的service的名称
#前面service创建的集群IP只能在内部访问,现在通过inpress映射service
#用户访问ingress生成的IP就会自动映射到service的集群IP,集群IP再映射到容器IP

[root@master ~]# kubectl apply -f ingress-example.yaml

2)验证效果


[root@master ~]# kubectl  get  ingress       #查看ingress资源,查看inpressIP地址
NAME HOSTS ADDRESS PORTS AGE
my-app * 192.168.1.31 80 16s

[root@localhost ~]# curl http://192.168.1.31 #现在,任意主机都可以访问服务
<pre>
Array
(
[REMOTE_ADDR] => 10.244.6.1
[REQUEST_METHOD] => GET
[HTTP_USER_AGENT] => curl/7.29.0
[REQUEST_URI] => /
)
php_host: apache-example-9d8577cf-lw74h



4 案例4:configMap练习


4.1 问题


本案例主要做configMap练习,具体要求如下:



  1. 通过configMap修改nginx的配置文件
  • 让nginx支持php
  • 4.2 方案

    ConfigMap是在Pod中映射(文件/目录)的一种方式,允许你将配置文件与镜像文件分离,以使容器化的应用程序具有可移植性。

    通过ConfigMap我们可以把真机的目录或文件映射到容器中。

    4.3 步骤

    实现此案例需要按照如下步骤进行。

    步骤一:创建configMap资源(在master主机操作)

    1)准备一个nginx的配置文件。

    启动一个容器,从容器中将nginx.conf文件拷贝到真机。

    [root@master ~]# kubectl run --generator=run-pod/v1 nginx-pod \
    --image=192.168.1.100:5000/myos:nginx
    #启动一个nginx容器
    

    [root@master ~]# kubectl cp
    nginx-pod:/usr/local/nginx/conf/nginx.conf nginx.conf
    #将容器中的nginx.conf配置文件拷贝到真机

    [root@master ~]# vim nginx.conf # 参考运维课程修改配置,支持动静分离
    #user nobody;
    worker_processes 2;
    #error_log logs/error.log;
    events {
    worker_connections 65535;
    }

    http {
    include mime.types;
    default_type application/octet-stream;
    #log_format main '$remote_addr - r e m o t e u s e r [ remote_user [ remoteuser[time_local] “KaTeX parse error: Expected 'EOF', got '#' at position 16: request" ' #̲ …status b o d y b y t e s s e n t " body_bytes_sent " bodybytessent"http_referer” ’
    # ‘“ h t t p u s e r a g e n t " " http_user_agent" " httpuseragent""http_x_forwarded_for”’;
    sendfile on;
    tcp_nopush on;
    keepalive_timeout 65;
    #gzip on;

    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page  404              /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        # pass the PHP scripts to FastCGI server
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            include        fastcgi.conf;
        }
    }
    

    }

    2)定义configMap


    configMap可以映射单一文件,也可以映射一个目录。


    语法格式:kubectl create configmap 名称 --from-file=文件路径


    [root@master ~]# kubectl create configmap nginx-conf --from-file=nginx.conf
    configmap “nginx-conf” created

    创建一个名称为nginx-conf的configMap,对应的是真机的nginx.conf文件

    [root@master ~]# kubectl get configmap nginx-conf #查看configMap
    NAME DATA AGE
    nginx-conf 1 10s

    3)使用资源文件启动容器调用前面定义的configMap


    资源文件已经工作在云盘第四阶段kubernetes/v1.17.6/config/目录下。


    [root@master ~]# cat configmap-example.yaml         			#查看下资源文件
    #这个资源文件中会启动两个容器,一个是php-fpm,一个是nginx
    #资源文件中仅给nginx容器映射了一个configmap

    [root@master ~]# kubectl apply -f configmap-example.yaml #创建资源

    [root@master ~]# kubectl get pod -o wide #查看资源IP
    NAME READY STATUS RESTARTS AGE IP
    myweb-xxx 2/2 Running 0 30s 10.244.1.44

    4)测试网页


    [root@master ~]# curl http://10.244.1.44/info.php            #访问测试
    <pre>
    … …
    php_host: myweb-b75456664-fvbll



    5 案例5:网络存储卷应用案例


    5.1 问题


    本案例练习练习使用网络存储卷,具体要求如下。



    1. 安装 NFS服务
  • 定义 PV,PVC
  • 在K8S集群中挂载NFS存储卷
  • 5.2 步骤

    实现此案例需要按照如下步骤进行。

    步骤一:部署NFS服务器(在192.168.1.100主机操作)

    1)部署服务器

    [root@registry ~]# yum install -y nfs-utils
    [root@registry ~]# mkdir -m 777 /var/webroot
    [root@registry ~]# vim  /etc/exports
    /var/webroot	*(rw)
    [root@registry ~]# systemctl enable --now nfs
    

    2)任意其他主机做客户端测试

    [root@localhost ~]# yum install -y nfs-utils
    [root@localhost ~]# showmount -e 192.168.1.100
    Export list for 192.168.1.100:
    /var/webroot *
    

    步骤二:创建PV/PVC资源(在master主机操作)

    对应的资源文件在云盘第四阶段kubernetes/v1.17.6/config/目录。

    1)创建PV资源

    [root@master ~]# cat   pv-example.yaml           #查看学习PV资源文件
    ---
    apiVersion: v1
    kind: PersistentVolume		# 声明持久卷
    metadata:
      name:  pv-nfs
      labels:
        app: web-nfs
    spec:
      volumeMode: Filesystem		# 支持Filesystem和Block
      capacity:				
        storage: 10Gi			# 卷提供的空间
      accessModes:			# 读写模式 RWO,ROX,RWX
      - ReadWriteMany			# RWX 模式
      persistentVolumeReclaimPolicy: Retain	# 卷资源回收方式 Retain,Delete
      nfs:
        path: /var/webroot
        server: 192.168.1.100
    [root@master ~]# kubectl apply -f   pv-example.yaml
    

    2)创建PVC资源(默认情况下PVC与PV会自动匹配容量大小、自动映射)

    [root@master ~]# cat   pvc-example.yaml             #查看学习PVC资源文件
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim		# PVC声明
    metadata:
      name: pvc-nfs
    spec:
      volumeMode: Filesystem		# 支持Filesystem和Block
      accessModes:			# 读写模式 RWO,ROX,RWX
        - ReadWriteMany			# RWX 模式
      resources:
        requests:
          storage: 10Gi			# 希望能提供的空间
      selector:
        matchLabels:
          app: web-nfs
    [root@master ~]# kubectl apply -f   pvc-example.yaml
    

    3)创建容器资源,调用PVC

    [root@master ~]# cat  volume-example.yaml           #查看学习资源文件
    ... ...
        spec:
          containers:
          - name: nginx-app
            image: myos:nginx
            ports:
            - containerPort: 80
            volumeMounts:
            - mountPath: /var/webroot 		# mount的路径
              name: site-data
          volumes:
          - name: site-data
            persistentVolumeClaim:
              claimName: pvc-nfs		 # mount的资源
    #使用myos:nginx镜像启动一个名称为nginx-app的容器
    #并给该容器把固定一个名称为pvc-nfs的PVC存储
    #将该PVC存储映射到nginx容器的/var/webroot目录
    

    [root@master ~]# kubectl apply -f volume-example.yaml



    6 案例6:课外实验(微服务web集群实战)


    6.1 问题


    本案例结合前面的实验步骤做一个综合的微服务课外练习,具体要求如下。



    1. 使用myos:php-fpm 创建后端应用php-app
  • 创建php-service,为后端应用提供内部clusterIP和负载均衡
  • 使用myos:nginx创建应用,并使用php-service解析php文件
  • 创建web-service,发布nginx应用到nodePort
  • 使用Ingress对外发布服务nginx应用
  • 6.2 步骤

    实现此案例需要参考前面的案例1至案例5的内容自行完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尹汇川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值