NSD CLOUD DAY09
- 案例1:编写service资源文件(一)
- 案例2:编写service资源文件(二)
- 案例3:对外发布服务
- 案例4:configMap练习
- 案例5:网络存储卷应用案例
- 案例6:课外实验(微服务web集群实战)
1 案例1:编写service资源文件(一)
1.1 问题
本案例要求学习service资源文件,具体要求如下:
- 创建service服务,访问后端apache
- 测试负载均衡
- 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 服务,具体要求如下:
- 创建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控制器,分别实现以下目标:
- 安装配置ingress控制器
- 通过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练习,具体要求如下:
- 通过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 问题
本案例练习练习使用网络存储卷,具体要求如下。
- 安装 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 问题
本案例结合前面的实验步骤做一个综合的微服务课外练习,具体要求如下。
- 使用myos:php-fpm 创建后端应用php-app
- 创建php-service,为后端应用提供内部clusterIP和负载均衡
- 使用myos:nginx创建应用,并使用php-service解析php文件
- 创建web-service,发布nginx应用到nodePort
- 使用Ingress对外发布服务nginx应用
6.2 步骤
实现此案例需要参考前面的案例1至案例5的内容自行完成。