当前位置: 首页 > news >正文

宜昌网站建设选择宜昌慧享互动江苏智能网站建设流程

宜昌网站建设选择宜昌慧享互动,江苏智能网站建设流程,wordpress 调用浏览数,搜索排名优化软件一、前言 在K8S中可以通过service对外暴露服务,由service代表一组pod对外提供服务,同时也提供了通过Ingress-controller组件对外提供服务的方式,Ingress-controller类似于一个反向代理,前端向用户侧提供服务,后端将服…

一、前言

在K8S中可以通过service对外暴露服务,由service代表一组pod对外提供服务,同时也提供了通过Ingress-controller组件对外提供服务的方式,Ingress-controller类似于一个反向代理,前端向用户侧提供服务,后端将服务请求转发到每一个service上。而Ingress则在Ingress-controller的基础之上提供了一个用户配置规则的入口。K8S通过Ingress可以提供4层、7层的反向代理,同时具备了将服务绑定到证书上对外通过HTTPS提供安全服务的能力,本文主要记录通过Ingress提供HTTPS服务的配置。

二、组件与访问流程介绍

引入Ingress-controller后,如下图所示:

基础网络安全-K8S 配置Ingress-controller 通过HTTPS处理服务请求_ingress-nginx

1) Ingress-controller是以容器的方式部署在K8S集群中,ingress-controller底层是以nginx、lvs等方式实现的,目前多选用nginx。

2) Ingress是为用户提供配置规则的一个入口,ingress-controller可以将该配置文件中的规则转换为nginx的规则。

3) Service与未引入ingress-controller时一样,只不过作为ingress中配置的后端服务,而不直接对外提供服务。

4) Secret:与etcd类似,用于在K8S中存储配置相关的信息的,所不同的是secret主要存储一些敏感信息,在该架构中,我们将HTTPS证书存储于secret中,并且在ingress中调用相关的信息。

访问流程:

用户向ingress-controller发起https请求,ingress-controller进行HTTPS证书卸载,并将请求向后端的backend进行转发,转到到某一个service上。

三、配置Ingress-controller提供HTTPS服务

(1)  部署ingress-controller

通过yml文件部署,可以参考github的官方说明,网址: https://github.com/kubernetes/ingress-nginx,可以看到有相关的版本说明:

基础网络安全-K8S 配置Ingress-controller 通过HTTPS处理服务请求_k8s_02

不过由于我的k8s版本为1.16,已经比较老旧了,没有找到完整的yml文件,我从网上相关博客搜索,配合文心一言,组合了一份完整的ingress.yml文件。

[root@k8s-master1 ingress]# cat ingress.ymlapiVersion: v1kind: Namespacemetadata:name: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx

kind: ConfigMapapiVersion: v1metadata:name: nginx-configurationnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx

kind: ConfigMapapiVersion: v1metadata:name: tcp-servicesnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx

---

kind: ConfigMapapiVersion: v1metadata:name: udp-servicesnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx

apiVersion: v1kind: ServiceAccountmetadata:name: nginx-ingress-serviceaccountnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx

---

apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRolemetadata:name: nginx-ingress-clusterrolelabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxrules:- apiGroups:- ""resources:- configmaps- endpoints- nodes- pods- secretsverbs:- list- watch- apiGroups:- ""resources:- nodesverbs:- get- apiGroups:- ""resources:- servicesverbs:- get- list- watch- apiGroups:- ""resources:- eventsverbs:- create- patch- apiGroups:- "extensions"- "networking.k8s.io"resources:- ingressesverbs:- get- list- watch- apiGroups:- "extensions"- "networking.k8s.io"resources:- ingresses/statusverbs:- update

 

---

apiVersion: rbac.authorization.k8s.io/v1beta1kind: Rolemetadata:name: nginx-ingress-rolenamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxrules:- apiGroups:- ""resources:- configmaps- pods- secrets- namespacesverbs:- get- apiGroups:- ""resources:- configmapsresourceNames:# Defaults to "<election-id>-<ingress-class>"# Here: "<ingress-controller-leader>-<nginx>"# This has to be adapted if you change either parameter# when launching the nginx-ingress-controller.- "ingress-controller-leader-nginx"verbs:- get- update- apiGroups:- ""resources:- configmapsverbs:- create- apiGroups:- ""resources:- endpointsverbs:- get

 

---

apiVersion: rbac.authorization.k8s.io/v1beta1kind: RoleBindingmetadata:name: nginx-ingress-role-nisa-bindingnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxroleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: nginx-ingress-rolesubjects:- kind: ServiceAccountname: nginx-ingress-serviceaccountnamespace: ingress-nginx

 

---

apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRoleBindingmetadata:name: nginx-ingress-clusterrole-nisa-bindinglabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxroleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: nginx-ingress-clusterrolesubjects:- kind: ServiceAccountname: nginx-ingress-serviceaccountnamespace: ingress-nginx

---

 

apiVersion: apps/v1kind: Deploymentmetadata:name: nginx-ingress-controllernamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxspec:replicas: 1selector:matchLabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxtemplate:metadata:labels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxannotations:prometheus.io/port: "10254"prometheus.io/scrape: "true"spec:serviceAccountName: nginx-ingress-serviceaccountcontainers:- name: nginx-ingress-controller#image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.25.0image: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.25.0args:- /nginx-ingress-controller- --configmap=$(POD_NAMESPACE)/nginx-configuration- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services- --udp-services-configmap=$(POD_NAMESPACE)/udp-services- --publish-service=$(POD_NAMESPACE)/ingress-nginx- --annotations-prefix=nginx.ingress.kubernetes.iosecurityContext:allowPrivilegeEscalation: truecapabilities:drop:- ALLadd:- NET_BIND_SERVICE# www-data -> 33runAsUser: 33env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespaceports:- name: httpcontainerPort: 80- name: httpscontainerPort: 443livenessProbe:failureThreshold: 3httpGet:path: /healthzport: 10254scheme: HTTPinitialDelaySeconds: 10periodSeconds: 10successThreshold: 1timeoutSeconds: 10readinessProbe:failureThreshold: 3httpGet:path: /healthzport: 10254scheme: HTTPperiodSeconds: 10successThreshold: 1timeoutSeconds: 10

 

---

 

apiVersion: v1 kind: Service metadata: name: ingress-nginx namespace: ingress-nginx spec: type: LoadBalancer# type: NodePortports: - name: http port: 80 targetPort: 80 protocol: TCP - name: https port: 443 targetPort: 443 protocol: TCP selector: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx

该文件中有几个关键的部分,包括namespace、configmap、serviceAccount、ClusterRole、Role、RoleBinding、ClusterRoleBing、Deployment、service。其中Deployment指定了nginx-ingress-controller镜像,用于将nginx-ingress-controller pod拉起,service则是用于将controller暴露出来。

执行kubectl create -f ingress.yml命令,可以看到相关的资源被创建,查看pod以及service的情况:

基础网络安全-K8S 配置Ingress-controller 通过HTTPS处理服务请求_ingress-controller_03

看一下nginx-ingress-controller的详细情况:kubectl describe pod nginx-ingress-controller-74879f74c6-cgrn2 -n ingress-nginx

基础网络安全-K8S 配置Ingress-controller 通过HTTPS处理服务请求_ingress_04

可以看到该pod运行在k8s-worker2上面。

注意:上面创建ingress-controller的过程中,其Pod,Service均在ingress-nginx namespace中。

(2)  创建HTTPS需要使用的证书

证书需要与域名绑定,假设域名为 www.mytest.com,使用Openssl生成证书:

# openssl genrsa -out server.key

# openssl req -new -x509 -key server.key -out server.crt -subj "/O=www.mytest.com,/CN=www.mytest.com"

此时已经生成了server.crt以及server.key两个文件。

(3)  将证书写入secret中

[root@k8s-master1 test]# kubectl create secret tls ingress-nginx-secret --key=server.key --cert=server.crt

基础网络安全-K8S 配置Ingress-controller 通过HTTPS处理服务请求_https_05

 (4)  创建后端的nginx服务

kubectl create deployment web --image=nginx:1.8

基础网络安全-K8S 配置Ingress-controller 通过HTTPS处理服务请求_https_06

(5)  创建提供nginx pod服务的service

kubectl expose deployment web --port=80 --target-port=80 --type=NodePort

基础网络安全-K8S 配置Ingress-controller 通过HTTPS处理服务请求_ingress-nginx_07

配置步骤四、五后可以通过 http://192.168.2.153:31111/访问到nginx服务了,下一步配置ingress规则,通过ingress-controller提供服务,并且启用HTTPS。

(6)  创建ingress规则

编写Ingress的资源清单,mytest-ingress01.yaml[root@k8s-master1 BrowerCert]# cat mytest-ingress01.yamlapiVersion: networking.k8s.io/v1beta1kind: Ingressmetadata:name: mytest-https# namespace: ingress-nginxspec:tls:- hosts:- www.mytest.comsecretName: ingress-nginx-secretrules:- host: www.mytest.comhttp:paths:- path: /# pathType: Prefixbackend:serviceName: webservicePort: 80

资源清单中hosts:www.mytest.com为域名,secretName为保存在secret中的证书的名称,serviceName及servicePort为第五步创建的服务名称与80端口。

kubectl apply -f mytest-ingress01.yaml

基础网络安全-K8S 配置Ingress-controller 通过HTTPS处理服务请求_ingress-nginx_08

 (7)  测试

查看ingress-controller情况:

基础网络安全-K8S 配置Ingress-controller 通过HTTPS处理服务请求_k8s_09

在windows的hosts中配置域名:

192.168.2.154 

浏览器中测试:

基础网络安全-K8S 配置Ingress-controller 通过HTTPS处理服务请求_k8s_10

 四、问题排查

1) 最开始的时候访问,通过kubectl logs -f -n ingress-nginx nginx-ingress-controller-74879f74c6-cgrn2命令查看ingress-controller日志,提示找不到err services "ingress-nginx" not found。该问题研究了很久,后来发现ingress.yml文件中没有service资源清单,补充后未再报该错误,完整资源清单见第一步。

kubectl logs -f -n ingress-nginx nginx-ingress-controller-74879f74c6-cgrn2查看实时日志,当Namespace不对,日志中报错,找不到相应的key或者service:

基础网络安全-K8S 配置Ingress-controller 通过HTTPS处理服务请求_https_11

调整namespace后,在kubectl apply -f mytest-ingress01.yaml的时候可以看到后端服务向controller注册成功:

基础网络安全-K8S 配置Ingress-controller 通过HTTPS处理服务请求_ingress-controller_12

2) nginx-ingress 报错 503 Service Temporarily Unavailable。要注意service、pod、ingress需要在相同的namespace中,本文是default;ingress-controller及其service是可以在其他namespace,本文是ingress-nginx。

五、总结

本文是基于k8s v1.16测试的ingress功能,配置了HTTPS对外提供服务。Ingress-controller可以主要用于负载均衡、反向代理,然而个人理解实际上是不适合配置HTTPS对外提供服务的,因为在实际的网络中,一定会部署IPS及WAF进行应用安全防护,因此需要在网络中对从用户发起的HTTPS请求进行SSL卸载转换为HTTP请求,然后才经过IPS/WAF的安全防护,否则设备可能不能识别流量中的异常行为。本文主要是熟悉在K8S中ingress-controller的功能,帮助在工作中遇到K8S进行安全评估。

 

最后我也整理了一些网络安全(黑客)方面的学习进阶资料

如果你想跟同道中人交流

http://www.dtcms.com/a/468120.html

相关文章:

  • 东莞建网站的公app开发及后期维护费用
  • 家乡网站策划书建设背景网站做不了301重定向
  • 杭州网站建设规划网站收录地址
  • 盐城网站建设优化建站惠州网站建设推广
  • 新浪云 建设网站房地产网站建设案例
  • 怎样在网站上做专栏一个公司做网站需要注意什么
  • 怎么查看什么公司做的网站吗用html5做课程教学网站
  • 建设银行网站维护电话网站建设考虑的因素
  • 网站漂浮宁波seo网络推广价格
  • 信丰县建设局网站国内可以上的网站
  • PyTorch的安装与使用——安装篇
  • vs2010网站开发与发布东莞seo外包公司哪家好
  • 电商网站建设基础ppt山东网站建设代理
  • 手机版网站如何制作软件大型移动网站建设
  • php学校网站建设汕头seo网站推广
  • 东莞高端网站设计有哪些网站做返利模式
  • 酒店网站建设考虑哪些因素做家居建材出口网站有哪些
  • 攀枝花住房和城乡建设厅官方网站网站建设好了怎么做推广
  • 宁夏免费做网站网站建设立项申请报告
  • 宇泽佛山网站建设wordpress 给文章添加幻灯
  • html5企业网站模板wordpress 访问量大
  • 旅游网站怎么设计数字营销公司排行榜
  • 哪家公司建站比较好苏州教育平台网站建设
  • 新注册的公司怎么做网站百度广告服务商
  • 文明网网站建设html家乡网站设计模板
  • 网上买手表哪个网站可以买到正品网站建设公司哪家好 都来磐石网络
  • 如何进入网站后台地址网络营销 长沙
  • 做网站客户不给钱怎么办用户体验设计师
  • 怎么样评价网站做的好坏更适合企业网站建设的cms系统
  • wordpress弹窗插件整站优化全网营销