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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 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搭建和管理企业级网站应用
目录
相关文章
|
10天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
71 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
2月前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
2月前
|
运维 Kubernetes Docker
深入理解容器化技术:Docker与Kubernetes的协同工作
深入理解容器化技术:Docker与Kubernetes的协同工作
53 1
|
2月前
|
Kubernetes Cloud Native 开发者
云原生入门:Kubernetes的简易指南
【10月更文挑战第41天】本文将带你进入云原生的世界,特别是Kubernetes——一个强大的容器编排平台。我们将一起探索它的基本概念和操作,让你能够轻松管理和部署应用。无论你是新手还是有经验的开发者,这篇文章都能让你对Kubernetes有更深入的理解。
|
2月前
|
运维 Cloud Native 云计算
云原生之旅:Docker容器化实战
本文将带你走进云原生的世界,深入理解Docker技术如何改变应用部署与运维。我们将通过实际案例,展示如何利用Docker简化开发流程,提升应用的可移植性和伸缩性。文章不仅介绍基础概念,还提供操作指南和最佳实践,帮助你快速上手Docker,开启云原生的第一步。
|
2月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
2月前
|
Kubernetes 负载均衡 Cloud Native
探索Kubernetes:云原生应用的基石
探索Kubernetes:云原生应用的基石
|
2月前
|
Kubernetes 监控 负载均衡
深入云原生:Kubernetes 集群部署与管理实践
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其弹性、可扩展性成为企业IT架构的首选。本文将引导你了解如何部署和管理一个Kubernetes集群,包括环境准备、安装步骤和日常维护技巧。我们将通过实际代码示例,探索云原生世界的秘密,并分享如何高效运用这一技术以适应快速变化的业务需求。
71 1
|
2月前
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
|
2月前
|
Kubernetes 监控 安全
容器化技术:Docker与Kubernetes的实战应用
容器化技术:Docker与Kubernetes的实战应用