k8s 暴露集群服务方式
k8s把集群服务暴露给外部有三种方式:1.service设置为NodePort类型集群内的每个节点都会暴露相同的端口,将访问这一节点的这一端口的请求转发给后端pod处理。可见,你访问node1:31203,node2:31203还是node3:31203,都被转发到同一service的一组后端pod进行处理。因此会浪费很多端口,一般使用ingress进行服务暴露。我们起了一个nodepo...
k8s把集群服务暴露给外部有三种方式:
1.service设置为NodePort类型
集群内的每个节点都会暴露相同的端口,将访问这一节点的这一端口的请求转发给后端pod处理。
可见,你访问node1:31203,node2:31203还是node3:31203,都被转发到同一service的一组后端pod进行处理。因此会浪费很多端口,一般使用ingress进行服务暴露。
我们起了一个nodeport类型的service:
➜ service kubectl get services nginx-service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service NodePort 10.254.98.39 <none> 5000:31203/TCP 21m
随意找一台node访问其31203端口,是可以访问的:
➜ service curl 10.206.105.201:31203
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
此外,nodeport方式兼容clusterip访问方式,你仍然可以使用上一篇文章中的clusterip:port进行访问,不过这需要你在集群内部进行访问,登陆到node或者pod里进行访问,本机只是利用kubeconfig连接了集群并不算在集群内部。
2. service设置为LoadBalance类型
此种方式将一个ip的所有流量都转发到这个service上,需要相关服务商,每个LoadBalancer比较贵,小编没有机会实践,此方式也兼容nodeport访问方式(那也就可以用cluster:port访问)
3. Ingress
需要集群装有ingress-controller才能使用ingress,Ingress 控制器有各种类型,我用nginx-ingress-controller来说明
ingress是七层调度,可根据路径规则转发多个service,ingress-controller感知ingress变化,将新的规则加入到ingress-nginx的pod中,并reload,使其生效
部署ingress:
相关yaml文件避免篇幅过长已上传到github
- 生成后端pod以及service
kubectl apply -f https://github.com/DoubleBabylol/k8s-yaml/blob/master/service.yaml
- 生成ingress
kubectl apply -f https://github.com/DoubleBabylol/k8s-yaml/blob/master/ingress.yaml
#查看ingress
➜ service kubectl get ingress ingress-ding
NAME HOSTS ADDRESS PORTS AGE
ingress-ding test.ding.com 80, 443 12h
- 找到ingress-nginx 的pod并进入
➜ service kubectl get pod ingress-nginx-6k6qm -o wide
NAME READY STATUS RESTARTS AGE IP NODE
ingress-nginx-6k6qm 1/1 Running 0 108d 10.206.105.155 docker4008.se.shyc2.qihoo.net
➜ kubectl exec -ti ingress-nginx-6k6qm /bin/sh
# cat nginx.conf
## start server test.ding.com
server {
server_name test.ding.com ; //此时ingress规则已经被加载进来了
listen 80;
set $proxy_upstream_name "-";
location / {
set $namespace "default";
set $ingress_name "ingress-ding";
set $service_name "myapp-ding";
set $service_port "80";
set $location_path "/";
rewrite_by_lua_block {
balancer.rewrite()
·········
## end server test.ding.com
- 退出容器后,在机器加入此podip的域名解析10.206.105.155
cat /etc/hosts
10.206.105.155 test.ding.com //加入此条规则
- 可以访问了
➜ service curl test.ding.com:80
<html>
..............
</html>
若要使用https ,则从客户端连接到达后端的传输会被加密 (本例为自签名证书)
# openssl genrsa -out tls.key 2048
# openssl req -new -x509 -key tls.key -out tls.crt
证书生成好了,然后把证书转成secret,
kubectl create secret tls ding-ingress-secret --cert=tls.crt --key=tls.key
在ingress.yaml 的spec中添加
tls: #添加了tls这一段
- hosts:
- test.ding.com
secretName: ding-ingress-secret #这里结束
重新apply
# curl https://test.ding.com:80 //就可以访问了
更多推荐
所有评论(0)