容器相关
非root用户Docker与K8S
Containerd安装
Containerd常用命令
Docker
镜像创建
国内镜像仓库
容器创建(Dockerfile)
容器系统
docker配置
docker数据管理
docker网络管理
docker容器自启动
docker镜像加速
docker问题
搭建Portainer可视化界面
Docker Swarm
Swarm搭建Docker集群
Docker Compose
Docker Compose命令
Docker Compose模板
Docker Machine
Kubernetes常用命令
k8s部署(kubeadmin)
k8s高可用部署
MiniKube
k8s1.24部署(containerd)
k8s1.24部署(docker)
部署 Dashboard
Kuboard K8S管理台
k8s权限管理
k8s网络插件
私有仓密码镜像拉取
k8s集群管理
POD--基本单位
Pod模板
Pod生命周期
Pod健康检查
初始化容器(initContainer)
Deployment--Pod的管理
Deployment模板
Deployment升级与回滚
DaemonSet控制器
StatefulSet控制器(有状态)
JOB与CRONJOB
Service--发布服务
ingress-traefix
ingress-nginx
MetalLB
存储与配置
持久存储卷
配置存储卷
资源管理
标签、选择器与注解
资源预留
调度管理
自动扩容
Proxy API与API Server
Helm--K8S的包管理器
helm常用命令
自定义Chart
私有chart仓库
helm dashboard
K8S证书过期
K8S问题解决
Harbor安装
Harbor操作
Harbor问题
Harbor升级
Docker Registry安装
Docker Registry鉴权
Registry用Nginx代理SSL及鉴权
Docker Registry问题
Istio 服务网络
常用示例
Gateway【服务网关】
kiali 可视化页面
开启HTTPS
linkerd 服务网络
本文档使用MrDoc发布
返回首页
-
+
Service--发布服务
2021年8月11日 10:48
admin
##kubectl代理转发 kubectl port-forward service/nginx 7080:80 --address 0.0.0.0 #本地7080端口,代理转发service nginx的80端口,0.0.0.0为所有ip可访问 --- ##创建Service #创建service的yml文件 vim service.yml #内容: apiVersion: v1 kind: Service metadata: name: service-python spec: type: ClusterIP ports: - port: 3000 protocol: TCP targetPort: 443 selector: run: pod-python --- #创建Service kubectl apply -f service.yml --- ##查询Service #查询当前运行的所有查询Deployment kubectl get services #(默认命名空间为default) kubectl get svc -o wide kubectl get deployments -n <namespace> kubectl get svc -n <namespace> -o wide 查看查询Service的详情 kubectl describe svc [Service名称] ![](/media//202108/2021-08-11162333549781.png) ##删除Service kubectl delete services [Service名称] kubectl delete svc [Service名称] ##查看Service配置 kubectl get services [Service名称] -o yaml kubectl get services [Service名称] -o json --- #支持的4种类型的Service #ClusterIP(默认) ![](/media//202108/2021-08-11102438025190.png) ####创建ClusterIP的Service yaml如下: apiVersion: v1 kind: Service metadata: name: service-python spec: ports: - port: 3000 protocol: TCP targetPort: 443 selector: run: pod-python type: ClusterIP ####使用 kuebctl get svc : ![](/media//202108/2021-08-11102543425009.png) #####类型为ClusterIP的service,这个service有一个Cluster-IP,其实就一个VIP。具体实现原理依靠kubeproxy组件,通过iptables或是ipvs实现。 ####这种类型的service 只能在集群内访问。 --- #NodePort ![](/media//202108/2021-08-11105150401222.png) ####创建NodePort 类型service 如下: apiVersion: v1 kind: Service metadata: name: service-python spec: ports: - port: 3000 protocol: TCP targetPort: 443 nodePort: 30080 selector: run: pod-python type: NodePort ####使用 kuebctl get svc : ![](/media//202108/2021-08-11110033822878.png) #####此时我们可以通过http://4.4.4.1:30080或http://4.4.4.2:30080 对pod-python访问。该端口有一定的范围,比如默认Kubernetes 控制平面将在--service-node-port-range标志指定的范围内分配端口(默认值:30000-32767)。 --- #LoadBalancer ![](/media//202108/2021-08-11110129140143.png) 并不是所有的k8s集群都会支持,大多是在公有云托管集群中会支持该类型。负载均衡器是异步创建的,关于被提供的负载均衡器的信息将会通过Service的status.loadBalancer字段被发布出去。 ####创建 LoadBalancer service 的yaml 如下: apiVersion: v1 kind: Service metadata: name: service-python spec: ports: - port: 3000 protocol: TCP targetPort: 443 nodePort: 30080 selector: run: pod-python type: LoadBalancer ####使用 kuebctl get svc : ![](/media//202108/2021-08-11110737975169.png) ###可以看到external-ip。我们就可以通过该ip来访问了。 ####当然各家公有云支持诸多的其他设置。大多是公有云负载均衡器的设置参数,都可以通过svc的注解来设置,例如下面的aws: metadata: name: my-service annotations: service.beta.kubernetes.io/aws-load-balancer-access-log-enabled: "true" # Specifies whether access logs are enabled for the load balancer service.beta.kubernetes.io/aws-load-balancer-access-log-emit-interval: "60" # The interval for publishing the access logs. You can specify an interval of either 5 or 60 (minutes). service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-name: "my-bucket" # The name of the Amazon S3 bucket where the access logs are stored service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-prefix: "my-bucket-prefix/prod" # The logical hierarchy you created for your Amazon S3 bucket, for example `my-bucket-prefix/prod` --- #externalIPs(内部服务暴露出去) apiVersion: v1 kind: Service metadata: name: my-service spec: type: ClusterIP selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 8080 externalIPs: - 192.168.1.100 - 192.168.1.101 --- #ExternalName(引入服务) #####将外部服务引入进来,通过一定格式映射到k8s集群,从而为集群内部提供服务。 #####也就是说,externalname类型的Service没有选择器,也没有定义任何的端口和端点,相反,对于运行在集群外部的服务,通过返回外部服务别名这种方式来提供服务。 ####创建 ExternalName service 的yaml 如下: apiVersion: v1 kind: Service metadata: name: exampleexternalnameservice spec: type: ExternalName externalName: www.baidu.com ####使用 kuebctl get svc : ![](/media//202108/2021-08-11115612609150.png) ####注意:此Service需要在Pod内通过DNS解析方式进行访问。 kubectl exec -it [PODID] /bin/bash #进入POD后,使用nslookup查询DNS信息 nslookup exampleexternalnameservice.default.svc.cluster.local ##注意:K8S中的DNS资源访问方式: ####{ServiceName}.{Namespace}.svc.{ClusterDomain} ![](/media//202108/2021-08-11120226354559.png) ####跟直接nslookup百度的结果一样 ![](/media//202108/2021-08-11120322397651.png) --- ##引入服务(Endpoints) kind: Service apiVersion: v1 metadata: name: storage namespace: op labels: app: storage spec: ports: - port: 80 targetPort: 8001 name: storage --- kind: Endpoints apiVersion: v1 metadata: name: storage namespace: op labels: app: storage subsets: - addresses: - ip: 10.188.100.100 - ip: 10.188.100.101 ports: - port: 8001 name: storage
分享到: