kubernetes(十) kubernetes service,ingress&cm,secret

网友投稿 256 2022-10-28

kubernetes(十) kubernetes service,ingress&cm,secret

Service

Service存在的意义

防止pod失联(服务发现) 定义一组pod的访问策略(负载均衡)

Pod 与Service的关系

通过label-selector相关联 通过Service实现Pod的负载均衡(TCP/UDP 4层)

Service的三种类型

ClusterIP

默认类型: 分配一个稳定的IP地址,即VIP,只能在集群内部访问(通Namespace内的POD)

NodePort

在每个节点上启用一个端口来暴露服务,可以在集群外部访问,也会分配一个稳定的内部集群IP地址 访问地址: :

LoadBalancer

iptables VS ipvs

iptables 默认的代理模式 灵活,功能强大 规则遍历匹配和更新,呈线性时延 ipvs 工作在内核态,有更高的性能 调度算法丰富: rr, wrr,lc,wlc,ip hash

ipvs模式在二进制部署的k8s集群中需要调整kube-proxy的配置文件 所有节点配置如下(master 和 node都需要做) 安装ipvs yum -y install ipvsadm modprobe br_netfilter cat > /etc/sysconfig/modules/ipvs.modules <<EOF #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

service DNS名称

CoreDNS:是一个dns服务器,kubernetes默认采用,以POD部署在集群中,coredns服务监视kubernetesAPI,为每一个service创建DNS记录用来作为域名解析 CoreDNS YAML文件:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns/coredns ClusterIP 的A记录格式: <service-name>.<namespace-name>.svc.cluster.local

深入理解ingress

ingress为弥补NodePort的不足而生

NodePort 存在的不足 一个端口只能一个服务使用,端口需要提前规划 只支持四层负载均衡

pod与ingress的关系

通过service相关联 通过ingress controller实现Pod的负载均衡 支持TCP/UDP四层和HTTP(S)七层

ingress controller

Ingress Controller有很多实现,我们这里采用官方维护的Nginx控制器。

部署文档:规则

基础准备

准备两个web service为后续的kubectl create deployment web --image=nginx:1.18-alpine #创建deploy $ kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web #暴露端口并创建svc=web的控制器 $ kubectl create deployment web1 --image=nginx:1.18-alpine $ kubectl expose deployment web1 --port=80 --type=NodePort --target-port=80 --name=web1

单域名基础配置

官方文档: https://kubernetes.io/zh/docs/concepts/services-networking/ingress/ 单域名yml

$ vim http_demo.yml apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: http-ingress spec: rules: - host: test.cropy.cn http: paths: - path: / backend: serviceName: web servicePort: 80 $ kubectl apply -f http_demo.yml $ kubectl get ingress #查看对应的ingress $ kubectl exec -it nginx-ingress-controller-5pn98 -n ingress-nginx -- bash #进入其中的一个ingressPod即可查看nginx.conf中的配置 cat nginx.conf| grep test.cropy.cn

> ca-config.json < ca-csr.json < blog.ctnrs.com-csr.json <

创建vim apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: tls-blog-cropy-cn-ingress spec: tls: - hosts: - blog.cropy.cn secretName: blog.cropy.cn rules: - host: blog.cropy.cn http: paths: - path: / backend: serviceName: web servicePort: 80 $ kubectl apply -f – 根据URL路由到多个服务

nginx根据URL路由到多个服务使用的是location 去做区分,nginx-ingress采用的是path去定义不同的后端服务,从而实现根据path路由多个服务

test.cropy.cn -> 192.168.56.14 -> / foo web:80 / bar web1:80

修改web和web1对应pod的html内容

$ kubectl get pod NAME READY STATUS RESTARTS AGE web-65b7447c7-ctdlr 1/1 Running 0 4d11h web1-6ff6f9d746-txnw4 1/1 Running 0 107s $ kubectl exec -it web-65b7447c7-ctdlr -- bash root@web-65b7447c7-ctdlr:/# echo "foo" > /usr/share/nginx/html/index.html $ kubectl exec -it web1-6ff6f9d746-txnw4 -- sh / # echo "bar" > /usr/share/nginx/html/index.html

配置yaml

$ vim location_http.yml apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: location-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: test.cropy.cn http: paths: - path: /foo backend: serviceName: web servicePort: 80 - path: /bar backend: serviceName: web1 servicePort: 80 $ kubectl apply -f location_http.yml

测试访问

http://test.cropy.cn/bar --| |-> foo.cropy.cn web:80 | 192.168.56.14 | bar.cropy.cn --| |-> bar.cropy.cn web1:80

yaml配置

$ vim domain_http.yml apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: name-virtual-host-ingress spec: rules: - host: foo.cropy.cn http: paths: - backend: serviceName: web servicePort: 80 - host: bar.cropy.cn http: paths: - backend: serviceName: web1 servicePort: 80 $ kubectl apply domain_http.yml $ kubectl get ingress

测试访问

# 修改hosts 192.268.56.14 foo.cropy.cn 192.268.56.14 bar.cropy.cn # 然后浏览器访问 bar.cropy.cn foo.cropy.cn

Annotations对Ingress个性化配置

官方文档:https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md 个性化定制proxy配置

$ vim personal_ apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: example-ingress-proxy annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/proxy-connect-timeout: "600" nginx.ingress.kubernetes.io/proxy-send-timeout: "600" nginx.ingress.kubernetes.io/proxy-read-timeout: "600" nginx.ingress.kubernetes.io/proxy-body-size: "10m" spec: rules: - host: example.cropy.cn http: paths: - path: / backend: serviceName: web servicePort: 80 $ kubectl apply -f personal_ $ kubectl exec nginx-ingress-controller-5pn98 -n ingress-nginx cat /etc/nginx/nginx.conf | grep proxy # 查看ingress pod下的nginx配置

定制化vim rewrite_ apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: tls-example-ingress annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/ssl-redirect: 'true' spec: tls: - hosts: - blog.cropy.cn secretName: blog.cropy.cn rules: - host: blog.cropy.cn http: paths: - path: / backend: serviceName: web servicePort: 80

ingress controller高可用方案

管理应用程序配置

secret

加密数据存放在etcd中,让pod的容器以挂载Volume的方式访问

应用场景: 凭据

pod使用secret的两种方式 变量注入: 不适用与随时变动的情况 挂载: 支持随时变动,但是生效需要一定的时间

创建secret

secret创建类型 docker-registry: Create a secret for use with a Docker registry generic: Create a secret from a local file, directory or literal value tls: Create a TLS secret

$ kubectl create namespace config $ kubectl create secret generic mysql-root-password -n config --from-literal=password=123456 # 创建环境变量 $ kubectl create secret tls blog.cropy.cn --cert=blog.cropy.cn.pem --key=blog.cropy.cn-key.pem # 创建证书型变量 $ kubectl create secret docker-registry my-secret --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL #创建私有仓库类型secret

引用所创建类型的secret

$ vim mysql_pod.yml apiVersion: v1 kind: Pod metadata: name: mysql namespace: config spec: containers: - name: mysql image: mysql:5.6 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: key: password name: mysql-root-password $ kubectl apply -f mysql_pod.yml

configmap

与secret类似,区别在于ConfigMap存放的是不需要加密的配置信息

应用场景: 应用程序配置

Examples: # Create a new configmap named my-config based on folder bar kubectl create configmap my-config --from-file=path/to/bar # Create a new configmap named my-config with specified keys instead of file basenames on disk kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt # Create a new configmap named my-config with key1=config1 and key2=config2 kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2 # Create a new configmap named my-config from the key=value pairs in the file kubectl create configmap my-config --from-file=path/to/bar # Create a new configmap named my-config from an env file kubectl create configmap my-config --from-env-file=path/to/bar.env

应用如何动态更新配置

ConfigMap更新时,业务也随之更新的方案: 当ConfigMap发生变更时,应用程序动态加载 触发滚动更新,即重启服务 其他方案 1、inotify 检查文件是否变动 -> 重启应用 (sidecar)2、与版本迭代一起(简单粗暴)3、进行热加载,需要程序有这块逻辑支持4、采用配置中心,例如apollo、disconf (与方法3类似)

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:跟着炎炎盐实践k8s---应用部署之Kubernetes Dashboard
下一篇:Java语言中finally是否一定会执行你知道吗
相关文章

 发表评论

暂时没有评论,来抢沙发吧~