【云原生 | 从零开始学Kubernetes】十九、Kubernetes核心技术Service实战 下

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Service实战

Service实战



创建Service:type类型是NodePort


1、创建一个 pod 资源 
[root@k8smaster service]# vim pod_nodeport.yaml 
apiVersion: apps/v1
kind: Deployment 
metadata: 
  name: my-nginx-nodeport
spec: 
  selector:
    matchLabels:
      run: my-nginx-nodeport
  replicas: 2  
  template:
    metadata:
      labels:
        run: my-nginx-nodeport
    spec:
      containers:
      - name: my-nginx-nodeport-container
        image: nginx 
        imagePullPolicy: IfNotPresent
        ports: 
        - containerPort: 80
#更新资源清单文件 
[root@k8smaster service]# kubectl apply -f pod_nodeport.yaml 
deployment.apps/my-nginx-nodeport created
#查看 pod 是否创建成功 
[root@k8smaster service]# kubectl get pods -l run=my-nginx-nodeport 
NAME                                 READY   STATUS    RESTARTS   AGE
my-nginx-nodeport-5fccbb754b-jdj67   1/1     Running   0          19s
my-nginx-nodeport-5fccbb754b-w5f8l   1/1     Running   0          19s
2、创建 service,代理 pod 
[root@xianchaomaster1 ~]# vim service_nodeport.yaml 
apiVersion: v1
kind: Service 
metadata: 
  name: my-nginx-nodeport
  labels:  
    run: my-nginx-nodeport  
spec: 
  type: NodePort
  ports:
  - port: 80 
    protocol: TCP
    targetPort: 80
    nodePort: 30380
  selector:
    run: my-nginx-nodeport
#更新资源清单文件 
[root@k8smaster service]# kubectl apply -f service_nodeport.yaml 
service/my-nginx-nodeport created
#查看刚才创建的 service 
[root@k8smaster service]# kubectl get svc -l run=my-nginx-nodeport 
NAME                TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
my-nginx-nodeport   NodePort   10.97.89.147   <none>        80:30380/TCP   111s
[root@k8smaster service]# kubectl get pods -o wide
NAME                                 READY   STATUS    RESTARTS   AGE     IP            NODE       NOMINATED
my-nginx-nodeport-5fccbb754b-jdj67   1/1     Running   0          9m14s   10.244.1.37   k8snode2   <none>   
my-nginx-nodeport-5fccbb754b-w5f8l   1/1     Running   0          9m14s   10.244.2.38   k8snode    <none>   
[root@k8smaster service]# kubectl describe svc my-nginx-nodeport
Name:                     my-nginx-nodeport
Namespace:                default
Labels:                   run=my-nginx-nodeport
Annotations:              Selector:  run=my-nginx-nodeport
Type:                     NodePort
IP:                       10.97.89.147
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30380/TCP
Endpoints:                10.244.1.37:80,10.244.2.38:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
#ip一样的
#访问 service 
[root@k8smaster service]# curl 10.97.89.147
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
注意: 
10.100.156.7 是 k8s 集群内部的 service ip 地址,只能在 k8s 集群内部访问,在集群外无法访问。 
都是80端口也没事,不冲突,会有新的ip加入到防火墙规则。
#在集群外访问 service 
[root@k8smaster service]# curl 192.168.11.139:30380
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
#在浏览器访问 service


6.png


服务请求走向


Client-node ip:30380->service ip:80->pod ip:container port


Client->192.168.11.139:30380->10.97.89.147:80->pod ip:80


创建Service:type类型是ExternalName


应用场景:跨名称空间访问 
需求:default 名称空间下的 client 服务想要访问 nginx-ns 名称空间下的 nginx-svc 服务 
docker load -i busybox.tar.gz
node1,2下载busybox
[root@k8smaster service]# vim client.yaml
apiVersion: apps/v1
kind: Deployment 
metadata: 
  name: client
spec: 
  replicas: 1
  selector:
    matchLabels:
      app: busybox
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:
      - name: busybox
        image: busybox
        imagePullPolicy: IfNotPresent
        command: ["/bin/sh","-c","sleep 36000"]
[root@k8smaster service]# kubectl apply -f client.yaml 
deployment.apps/client created
[root@k8smaster service]# vim client_svc.yaml 
apiVersion: v1
kind: Service
metadata: 
  name: client-svc
spec: 
  type: ExternalName
  externalName: nginx-svc.nginx-ns.svc.cluster.local
  ports:
  - name: http
    port: 80
    targetPort: 80
该文件中指定了到 nginx-svc 的软链,让使用者感觉就好像调用自己命名空间的服务一样,访问 client-svc 会代理到 nginx-svc.nginx-ns.svc.cluster.local
[root@k8smaster service]# kubectl apply -f client_svc.yaml 
service/client-svc created
查看 pod 是否正常运行
[root@k8smaster service]# kubectl get pods 
NAME                     READY   STATUS    RESTARTS   AGE
client-849cbd69b-76hcp   1/1     Running   0          5m22s
[root@k8smaster service]# kubectl describe svc client-svc
Name:              client-svc
Namespace:         default
Labels:            <none>
Annotations:       Selector:  <none>
Type:              ExternalName
IP:                
External Name:     nginx-svc.nginx-ns.svc.cluster.local   #FQDN
Port:              http  80/TCP               #服务本身端口
TargetPort:        80/TCP
Endpoints:         <none>                 #因为没有定义selector所以也是空
Session Affinity:  None
Events:            <none>
#新建一个命名空间,把nginx的东西放在下面。
[root@k8smaster service]# kubectl create ns nginx-ns 
namespace/nginx-ns created
[root@k8smaster service]# vim server_nginx.yaml 
apiVersion: apps/v1
kind: Deployment 
metadata: 
  name: nginx
  namespace: nginx-ns
spec: 
  replicas: 1
  selector:
    matchLabels:     
      app: nginx  
  template: 
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
#nginx默认暴露80,所以可以找到deploy控制器创建的pod,进入到pod封装的容器nginx里面。
[root@k8smaster service]# kubectl apply -f server_nginx.yaml 
deployment.apps/nginx created
#查看 pod 是否创建成功 
[root@k8smaster service]# kubectl get pods -n nginx-ns 
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5957f949fc-9nwbh   1/1     Running   0          10s
[root@xianchaomaster1 exter]# vim nginx_svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  namespace: nginx-ns
spec:
  selector:
    app: nginx
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
[root@k8smaster service]# kubectl apply -f nginx_svc.yaml 
service/nginx-svc created
[root@k8smaster service]# kubectl describe svc nginx-svc -n nginx-ns
Name:              nginx-svc
Namespace:         nginx-ns
Labels:            <none>
Annotations:       Selector:  app=nginx
Type:              ClusterIP
IP:                10.101.124.84
Port:              http  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.39:80      #ip是一样的 这个service通过标签选择器选择app=nginx的pod也就是第二个模板创建的
Session Affinity:  None
Events:            <none>
[root@k8smaster service]# kubectl get pods -o wide -n nginx-ns
NAME                     READY   STATUS    RESTARTS   AGE     IP            NODE     
nginx-5957f949fc-9nwbh   1/1     Running   0          7m49s   10.244.1.39   k8snode2
[root@k8smaster service]# curl 10.101.124.84
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
#登录到 client pod 
[root@xianchaomaster1 exter]# kubectl exec -it client-849cbd69b-76hcp -- /bin/sh 
/ # wget -q -O - client-svc.default.svc.cluster.local 
wget -q -O - nginx-svc.nginx-ns.svc.cluster.local
#上面两个请求的结果一样,这个实验是为了有些情况下想通过默认命名空间下的全局限定域名到其他命名空间下的服务和服务区域通信访问。


映射外部服务案例


k8s 集群引用外部的 mysql 数据库


node2安装mysql
[root@k8snode2 ~]# yum install mariadb-server.x86_64 -y 
[root@k8snode2 ~]# systemctl start mariadb 
[root@k8snode2 ~]# systemctl enable mariadb 
[root@k8smaster ~]# mkdir mysql
[root@k8smaster ~]# cd mysql/
[root@k8smaster mysql]# vim mysql_service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  type: ClusterIP
  ports:
  - port: 3306
[root@k8smaster mysql]# kubectl apply -f mysql_service.yaml 
service/mysql created
[root@k8smaster mysql]# kubectl get svc | grep mysql 
mysql        ClusterIP      10.103.7.164   <none>                                 3306/TCP   4s
[root@k8smaster mysql]# kubectl describe svc mysql 
Name:              mysql
Namespace:         default
Labels:            <none>
Annotations:       Selector:  <none>
Type:              ClusterIP
IP:                10.103.7.164
Port:              <unset>  3306/TCP
TargetPort:        3306/TCP
Endpoints:         <none>   #还没有 endpoint 
Session Affinity:  None
Events:            <none>
[root@k8smaster mysql]# vim mysql_endpoint.yaml        endpoint和svc的名字保持一致
apiVersion: v1
kind: Endpoints       
metadata: 
  name: mysql
subsets: 
- addresses:  
  - ip: 192.168.40.182
  ports:  
  - port: 3306
[root@k8smaster mysql]# kubectl apply -f mysql_endpoint.yaml 
endpoints/mysql created
[root@k8smaster mysql]# kubectl describe svc mysql 
Name:              mysql
Namespace:         default
Labels:            <none>
Annotations:       Selector:  <none>
Type:              ClusterIP
IP:                10.103.7.164
Port:              <unset>  3306/TCP
TargetPort:        3306/TCP
Endpoints:         192.168.40.182:3306      #这就是定义的外部数据库
Session Affinity:  None
Events:            <none>
mysql.default.svc.cluster.local     #这就是它的全局域名


上面配置就是将外部 IP 地址和服务引入到 k8s 集群内部(其他节点),由 service 作为一个代理来达到能够访问外部服务的目的。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
2月前
|
消息中间件 存储 Cloud Native
云消息队列 Kafka 版 V3 系列荣获信通院“云原生技术创新标杆案例”
2024 年 12 月 24 日,由中国信息通信研究院(以下简称“中国信通院”)主办的“2025 中国信通院深度观察报告会:算力互联网分论坛”,在北京隆重召开。本次论坛以“算力互联网 新质生产力”为主题,全面展示中国信通院在算力互联网产业领域的研究、实践与业界共识,与产业先行者共同探索算力互联网产业未来发展的方向。会议公布了“2024 年度云原生与应用现代化标杆案例”评选结果,“云消息队列 Kafka 版 V3 系列”荣获“云原生技术创新标杆案例”。
|
13天前
|
人工智能 Kubernetes 异构计算
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
|
13天前
|
人工智能 Cloud Native 多模数据库
实力见证!数据管理服务DMS、云原生多模数据库Lindorm荣获“2024技术卓越奖”
实力见证!数据管理服务DMS、云原生多模数据库Lindorm荣获“2024技术卓越奖”
|
23天前
|
Kubernetes 持续交付 数据库
阿里云ACK+GitLab企业级部署实战教程
GitLab 是一个功能强大的基于 Web 的 DevOps 生命周期平台,整合了源代码管理、持续集成/持续部署(CI/CD)、项目管理等多种工具。其一体化设计使得开发团队能够在同一平台上进行代码协作、自动化构建与部署及全面的项目监控,极大提升了开发效率和项目透明度。 GitLab 的优势在于其作为一体化平台减少了工具切换,高度可定制以满足不同项目需求,并拥有活跃的开源社区和企业级功能,如高级权限管理和专业的技术支持。借助这些优势,GitLab 成为许多开发团队首选的 DevOps 工具,实现从代码编写到生产部署的全流程自动化和优化。
|
1月前
|
人工智能 Kubernetes 异构计算
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
本教程演示如何在ACK中多机分布式部署DeepSeek R1满血版。
|
12天前
|
边缘计算 Cloud Native 调度
感谢认可!阿里云云原生大规模云边协同技术荣获浙江省科学技术进步奖一等奖
感谢认可!阿里云云原生大规模云边协同技术荣获浙江省科学技术进步奖一等奖
|
15天前
|
运维 分布式计算 Kubernetes
ACK One多集群Service帮助大批量应用跨集群无缝迁移
ACK One多集群Service可以帮助您,在无需关注服务间的依赖,和最小化迁移风险的前提下,完成跨集群无缝迁移大批量应用。
|
3月前
|
运维 Cloud Native Serverless
Serverless Argo Workflows大规模计算工作流平台荣获信通院“云原生技术创新标杆案例”
2024年12月24日,阿里云Serverless Argo Workflows大规模计算工作流平台荣获由中国信息通信研究院颁发的「云原生技术创新案例」奖。
|
3月前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。
|
3月前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。

热门文章

最新文章