k8s中的容器服务

cluster IP

service通过labels管理deployment,deplyment通过标签管理pod。但是如果想要能够通过service访问pod的服务,需要service和pod的标签相同。如果只是和deployment的标签相同,而deployment又通过不同的标签管理pod,那么通过service暴露的ip则访问不通。

我之前以为service匹配deployment就可以了,然后由deployment去将请求给到pod就行了,但是现在看来不仅如此,还需要service和pod labels相同才行。

默认的service相当轮询

无头服务:

对于无头 Services 并不会分配 Cluster IP,kube-proxy不会处理它们, 而且平台也不会为它们进行负载均衡和路由,集群访问通过dns解析直接指向到业务pod上的IP,所有的调度有dns单独完成

如果想访问无头模式下的service

方式1: 可以进入pod里面,然后执行nslookup 服务名(随便哪个pod都行)

然后直接curl 地址

方法2:通过pod的域名访问,待实践

NodePort

1. 首先还是创建pod

不过我发现了这个容易被忽视的name参数。容器的唯一标识。因为一pod可以有多个容器,pod的name就是用来区分的。

使用 kubectl logs <pod名称> -c myapp 可以查看该容器的日志,kubectl exec -it <pod名称> -c myapp -- /bin/bash 可以进入该容器的命令行界面。

2. 创建svc

在这里把spec.type类型改一下

3. 访问一下

集群内:

集群外:

正常是外部主机通过master节点的对外ip:<port>来访问pod业务

云上由于每个都能成为master,测试下来发现访问每个节点都会跳过去。

4. 注意

nodeport默认端口是30000-32767,超出会报错

  1. 不想使用默认端口,想使用自定义的,添加这个参数即可
  1. 想自定义某个范围的端口号

vim /etc/kubernetes/manifests/kube-apiserver.yaml

添加"--service-node-port-range=" 参数,端口范围可以自定义

修改后api-server会自动重启,等apiserver正常启动后才能操作集群

集群重启自动完成在修改完参数后全程不需要人为干预

loadbalancer

云平台会自动帮我们创建一个vip

访问:

这里如果服务不是默认80端口的话,也要指定端口哦

ingress

Ingress由两部分组成:Ingress controller和Ingress服务

Ingress Controller 会根据你定义的 Ingress 对象,提供对应的代理能力。

业界常用的各种反向代理项目,比如 Nginx、HAProxy、Envoy、Traefik 等,都已经为Kubernetes 专门维护了对应的 Ingress Controller。

1. 安装ingress,云平台安装组件后自动

在ingress-nginx-controller中看到的对外IP就是ingress最终对外开放的ip

2. 创建ingress对象,也就是定义转发规则

3. 访问

基于域名

这里访问不通的原因

因为规则配置了带域名了,如果想要通过IP访问

要么不配置域名,要么这样

基于路径访问

这个时候你会发现访问不通

因为没有配置annotations,默认情况下,Nginx Ingress 将访问路径直接转发到后端服务中的相同路径,如果不配置 URL 重写规则,由于访问路径和服务路径不同,访问将返回404

因为服务的路径一直是www.myapp.com. 这两个服务其实访问路径都是www.myapp.com. 只是通过path去选择某一个service。这点很重要!

nginx.ingress.kubernetes.io/rewrite-target: / #访问路径后加任何内容都被定向到/

配置后访问:

tls加密
  1. 生成证书密钥

openssl req -newkey rsa:2048 -nodes -keyout tls.key -x509 -days 365 -subj "/CN=nginxsvc/O=nginxsvc" -out tls.crt

2.创建secret

kubectl create secret tls web-tls-secret --key tls.key --cert tls.crt

  1. 修改ingress

访问

auth认证
  1. 通过htpasswd生成认证文件
  1. 生成secret
  1. 创建ingress

成功访问和失败访问

配置上域名试试

OK,看起来是正常的

相关推荐
谢景行^顾2 小时前
数据结构知识掌握
linux·数据结构·算法
似水流年 光阴已逝2 小时前
Kubernetes Deployment 控制器
云原生·容器·kubernetes
人工智能训练3 小时前
如何在 Ubuntu 22.04 中安装 Docker 引擎和 Linux 版 Docker Desktop 桌面软件
linux·运维·服务器·数据库·ubuntu·docker·ai编程
Maple_land4 小时前
Linux复习:系统调用与fork
linux·运维·服务器·c++·centos
996终结者4 小时前
Docker核心用途实战:彻底解决环境一致性问题
运维·docker·容器
无聊的小坏坏4 小时前
Poll 服务器实战教学:从 Select 迁移到更高效的多路复用
linux·服务器·poll·io多路复用
阿桂有点桂5 小时前
Docker搭建Ngnix、php5.6、php8、postgresql、redis
运维·服务器·docker·容器
WAsbry5 小时前
InputConnection机制与跨进程文本操作的工程实践
android·linux
wdfk_prog5 小时前
[Linux]学习笔记系列 -- [kernel]cpu
linux·笔记·学习