Ingress 是对集群中服务的外部访问进⾏管理的 API 对象,典型的访问⽅式是 HTTP
Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管
通过Ingress发现pod进⾏关联。基于域名访问
通过Ingress controller实现POD负载均衡
⽀持TCP/UDP 4层负载均衡和HTTP 7层负载均衡
步骤:
执行下面这个文件,格式是yaml的,读者可以复制以下内容,保存格式为yaml格式的。
apiVersion: v1
kind: Namespace
metadata:
name: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:
name: nginx-configuration
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:
name: tcp-services
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:
name: udp-services
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: nginx-ingress-serviceaccount
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: nginx-ingress-clusterrole
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
rules:
- apiGroups:
- ""
resources:
- configmaps
- endpoints
- nodes
- pods
- secrets
verbs:
- list
- watch
- apiGroups:
- ""
resources:
- nodes
verbs:
- get
- apiGroups:
- ""
resources:
- services
verbs:
- get
- list
- watch
- apiGroups:
- "extensions"
resources:
- ingresses
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- events
verbs:
- create
- patch
- apiGroups:
- "extensions"
resources:
- ingresses/status
verbs:
- update
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
name: nginx-ingress-role
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
rules:
- apiGroups:
- ""
resources:
- configmaps
- pods
- secrets
- namespaces
verbs:
- get
- apiGroups:
- ""
resources:
- configmaps
resourceNames:
# Defaults to "-"
# Here: "-"
# 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:
- configmaps
verbs:
- create
- apiGroups:
- ""
resources:
- endpoints
verbs:
- get
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
name: nginx-ingress-role-nisa-binding
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: nginx-ingress-role
subjects:
- kind: ServiceAccount
name: nginx-ingress-serviceaccount
namespace: ingress-nginx
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: nginx-ingress-clusterrole-nisa-binding
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: nginx-ingress-clusterrole
subjects:
- kind: ServiceAccount
name: nginx-ingress-serviceaccount
namespace: ingress-nginx
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-ingress-controller
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
selector:
matchLabels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
template:
metadata:
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
annotations:
prometheus.io/port: "10254"
prometheus.io/scrape: "true"
spec:
hostNetwork: true
serviceAccountName: nginx-ingress-serviceaccount
containers:
- name: nginx-ingress-controller
image: siriuszg/nginx-ingress-controller:0.20.0
args:
- /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.io
securityContext:
allowPrivilegeEscalation: true
capabilities:
drop:
- ALL
add:
- NET_BIND_SERVICE
# www-data -> 33
runAsUser: 33
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
livenessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 10
readinessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10254
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
spec:
#type: NodePort
ports:
- 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
底层还是通过Nginx实现的
将创建好的文件通过我们之前的拖拽方式,直接拖拽到k8s文件夹下,如下
应用刚刚上传的配置
kubectl apply -f ingress-controller.yaml
查看
[root@k8s-node1 k8s]# kubectl get pods --all-namespaces
这⾥master节点负责调度,具体执⾏交给node2和node3来完成,能够看到它们正在下载完成了镜像,并且已经在运行了。
在上述命令后加 -o wide可以看具体执行在哪个节点下面
在node2下面可以看到节点
上一篇我们讲到通过yaml来配置Tomcat,这样我们可以通过host和端口直接访问到我们集群中的任意一个节点,例如
但是如果我们集群中该节点挂掉了,那么通过host+端口的方式 就访问不到了,这时候反向代理和负载均衡就能派上用场了。通过域名的方式就可以一举多得。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: web
spec:
rules:
- host: tomcat6.kubenetes.com
http:
paths:
- backend:
serviceName: tomcat6
servicePort: 80
[root@k8s-node1 k8s]# touch ingress-tomcat6.yaml
#将上⾯的规则,添加到ingress-tomcat6.yaml⽂件中
[root@k8s-node1 k8s]# vi ingress-tomcat6.yaml
[root@k8s-node1 k8s]# kubectl apply -f ingress-tomcat6.yaml
ingress.extensions/web created
[root@k8s-node1 k8s]#
修改本机的hosts⽂件,添加如下的域名转换规则:
192.168.56.102 tomcat6.kubenetes.com
修改软件下载,SwitchHost
如果出现保存的时候说没有写入Host权限的话,可以修改一下Host文件的权限,进行写入host。记住打开SwitchHost软件的时候一定是以管理员身份打开才行。
如果不行的话,把当前用户的权限也打开一下
最后执行成功。
使用域名成功访问到了。
并且集群中即便有⼀个节点不可⽤,也不影响整体的运⾏。
默认的dashboard没啥⽤,我们⽤kubesphere可以打通全部的devops链路,kubesphere集成了很多套件,集群要求⽐较⾼
https://kubesphere.io
kuboard也很不错,集群要求不⾼
https://kuboard.cn/support/
KubeSphere 是在 Kubernetes 之上构建的⾯向云原⽣应⽤的分布式操作系统,完全开源,⽀持多云与多集群管理,提供全栈的 IT ⾃动化运维的能⼒,简化企业的 DevOps ⼯作流。它的架构可以⾮常⽅便地使第三⽅应⽤与云原⽣⽣态组件进⾏即插即⽤ (plug-and-play) 的集成。
作为全栈的多租户容器平台,KubeSphere 提供了运维友好的向导式操作界⾯,帮助企业快速构建⼀个强⼤和功能丰富的容器云平台。KubeSphere 为⽤户提供构建企业级 Kubernetes 环境所需的多项功能,例如多云与多集群管理、Kubernetes 资源管理、DevOps、应⽤⽣命周期管理、微服务治理(服
务⽹格)、⽇志查询与收集、服务与⽹络、多租户管理、监控告警、事件与审计查询、存储管理、访问权限控制、GPU ⽀持、⽹络策略、镜像仓库管理以及安全管理等。
KubeSphere 还开源了 Kubekey 帮助企业⼀键在公有云或数据中⼼快速搭建 Kubernetes 集群,提供单节点、多节点、集群插件安装,以及集群升级与运维。
对于刚接触 KubeSphere 并想快速上⼿该容器平台的⽤户,All-in-One 安装模式是最佳的选择,它能够帮助您零配置快速部署 KubeSphere 和 Kubernetes。
若要以 All-in-One 模式进⾏安装,您仅需参考以下对机器硬件和操作系统的要求准备⼀台主机。硬件推荐配置
因为电脑本身配置的原因,所以这里只在node1节点上进行安装。
备注
以上的系统要求和以下的说明适⽤于没有启⽤任何可选组件的默认最⼩化安装。如果您的机器⾄少有 8Core CPU 和 16 G 内存,则建议启⽤所有组件。有关更多信息,请参⻅启⽤可插拔组件。
之前在前面的文档中,我们第一次安装好了节点 以后,备份了一次,现在我们要通过那个备份文件快速备份回去。
可以看到备份回去以后,一夜回到了解放前
然后现在重新配置节点,能给多大内存就给多大内存。我的电脑配置是
i7 12700H 32+512G的
不要超过那条红线的开始节点就行。
节点要求
节点必须能够通过 SSH 连接。
节点上可以使⽤ sudo / curl / openssl 命令。
docker 可以由您⾃⼰安装或由 KubeKey 安装。
备注
如果您想离线安装 KubeSphere,请务必提前安装好 docker 。
依赖项要求
KubeKey 可以将 Kubernetes 和 KubeSphere ⼀同安装。针对不同的 Kubernetes 版本,需要安装的依赖项可能有所不同。您可以参考以下列表,查看是否需要提前在节点上安装相关的依赖项。
信息
KubeKey 是⽤ Go 语⾔开发的⼀款全新的安装⼯具,代替了以前基于 ansible 的安装程序。KubeKey 为⽤户提供了灵活的安装选择,可以分别安装 KubeSphere 和 Kubernetes 或⼆者同时安装,既⽅便⼜⾼效。
⽹络和 DNS 要求
必须确保 /etc/resolv.conf 中的 DNS 配置可⽤,否则集群中的 DNS 可能会有问题。
如果您的⽹络配置使⽤了防⽕墙或安全组,请确保基础设施组件可以通过特定端⼝相互通信。有关更多信息,请参⻅端⼝要求关闭防⽕墙。
提示
建议您的操作系统处于⼲净状态(不安装任何其他软件),否则可能会发⽣冲突。
如果您⽆法从 dockerhub.io 下载容器镜像,建议提前准备好容器镜像或者配置镜像加速器。有关更多信息,请参⻅为安装配置加速器。
请按照以下步骤下载 KubeKey。
如果您能正常访问 GitHub/Googleapis
如果您访问 GitHub/Googleapis 受限
先执⾏以下命令以确保您从正确的区域下载 KubeKey。
export KKZONE=cn
执⾏以下命令下载 KubeKey
curl -sfL https://get-kk.kubesphere.io | VERSION=v1.0.1 sh -
备注
在您下载 KubeKey 后,如果您将其传⾄新的机器,且访问 Googleapis 同样受限,在您执⾏以下步骤之前请务必再次执⾏ export KKZONE=cn 命令。
备注
执⾏以上命令会下载最新版 KubeKey (v1.0.1),您可以修改命令中的版本号下载指定版本。
为 kk 添加可执⾏权限:
chmod +x kk
在本快速⼊⻔教程中,您只需执⾏⼀个命令即可进⾏安装,其模板如下所示:
./kk create cluster [--with-kubernetes version] [--with-kubesphere version]
若要同时安装 Kubernetes 和 KubeSphere,可参考以下示例命令:
./kk create cluster --with-kubernetes v1.17.9 --with-kubesphere v3.0.0
安装的过程会比较久一点
安装过程中出现
docker安装失败的原因是因为我们还没有配置docker的阿里云,需要把这个再执行一次。
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://azk2srw0.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
备注
⽀持的 Kubernetes 版本:v1.15.12, v1.16.13, v1.17.9 (默认), v1.18.6。
⼀般来说,对于 All-in-One 安装,您⽆需更改任何配置。
如果您在这⼀步的命令中不添加标志 --with-kubesphere ,则不会部署 KubeSphere,KubeKey将只安装 Kubernetes。如果您添加标志 --with-kubesphere 时不指定 KubeSphere 版本,则会安装最新版本的 KubeSphere。
KubeKey 会默认安装 OpenEBS 为开发和测试环境提供 LocalPV 以⽅便新⽤户。对于其他存储类型,请参⻅持久化存储配置。
当您看到以下输出时,表明安装已经完成。
当上述容器都已经执行准备就绪的时候,执行一下命令
输⼊以下命令以检查安装结果。
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f
输出信息会显示 Web 控制台的 IP 地址和端⼝号,默认的 NodePort 是 30880 。现在,您可以使⽤默认的帐户和密码 ( admin /P@88w0rd ) 通过 EIP:30880 访问控制台。
上述已经安装成功了!访问的时候我们用192.68.56.200去访问
备注
您可能需要配置端⼝转发规则并在安全组中开放端⼝,以便外部⽤户访问控制台。
登录⾄控制台后,您可以在服务组件中查看各个组件的状态。如果要使⽤相关服务,您可能需要等待部分组件启动并运⾏。您也可以使⽤ kubectl get pod --all-namespaces 来检查 KubeSphere 相关组件的运⾏状况。
登录以后可以 去工作台改一下个人密码,规则 大小写 +数字。
平台管理下
集群管理 下
项目管理下:
工作负载下:
自带的kubectl 命令工具