大量报告不断表明,今天的企业将混合和多云作为其首选的IT基础设施部署模式。根据IDG的一项调查,超过一半(55%)的组织目前使用多个公有云,21%的组织说他们使用三个或更多的公有云。
- 云计算调查:https://resources.idg.com/download/2020-cloud-computing-executive-summary-rl
- 本文来自于CNCF:https://www.cncf.io/blog/2021/01/06/multicloud-kubernetes-management-with-lens/
- 更多参考:
随着开发人员逐渐适应构建和发布容器,Kubernetes已成为容器编排的首选。
组织为什么要跨多个云供应商部署Kubernetes有很多原因:
- 云爆发
在多云基础设施中,“爆发(bursting)”涉及使用一个云的资源来补充另一个云的资源。当使用私有云的组织达到100%的资源容量时,溢出的流量会被转移到公有云,避免业务中断。
- 灾难恢复与备份
在实践中,你不希望一个云提供商成为单点故障。通过在云上分散恢复资源,你可以获得比单一云基础设施更大的弹性和可用性。
在所有这些基础设施就绪之后,IT运营团队管理多个集群非常具有挑战性。出现了以下挑战:
-
要访问集群,需要维护大量的kubectl和kubeconfig文件。对于不同的集群/项目,必须在它们之间进行上下文切换,而且跨云提供商访问方法的不同增加了复杂性,这可能会很麻烦。
-
虽然开发人员通常专注于编写代码,但现在他们学习应用程序的操作方面也并不罕见。虽然Kubernetes旨在帮助他们更快地发布和更新应用程序,但它本身就很复杂。他们希望能够加快概念的学习速度,加快学习曲线,这样他们就可以专注于最重要的东西:应用程序代码。
-
在Kubernetes中进行故障排除并不是一项简单的任务。在调试过程中,管理员必须从pod日志和事件、pod状态等中识别错误。新管理员很容易花费大量宝贵的时间来找出正确的命令和日志,以检查对业务的不利影响。
Kubernetes暴露了一个标准的仪表板,它提供了在集群上运行的应用程序的概览,但这是在单个集群级别上完成的。希望有一个统一的管理解决方案来解决上述挑战。今天我们将聚焦于开源解决方案Lens。
Lens是一个独立的应用程序,可以在MacOS、Windows和Linux上使用,这意味着你不需要在Kubernetes节点本身安装任何包。通过导入kubeconfig文件,单个IDE可以用于管理任何平台上的所有集群。让我们一起来看看。
安装Lens
浏览Lens网页,在你喜欢的操作系统下载并安装。打开应用程序后,立即点击“+”按钮添加集群。你可以导入kubeconfig文件或粘贴它,瞧!让魔法开始吧。
我已经部署了两个集群,一个使用Karbon(Nutanix的Kubernetes管理解决方案)在Nutanix私有云上,另一个使用Azure Kubernetes服务。为AKS集群导入kubeconfig文件如下所示。
在集群概览中,你可以通过单个窗格玻璃看到所有可用的集群资源。你可以查看所有工作负载、它们的当前状态、任何相关事件,甚至可以通过命名空间对它们进行过滤。点击任何资源都会拉出它的所有细节-基本上,就像你从以下输出中看到的一样:
kubectl get <daemonset|pod|deployment> -n <namespace> <name> -o yaml
如下:
部署应用程序
在这里,我添加了Karbon集群,以及Lens。让我们继续并将Cassandra StatefulSet部署到这个集群上。
下面是我使用的YAML:
apiVersion: v1
kind: Service
metadata:
labels:
app: cassandra
name: cassandra
spec:
clusterIP: None
ports:
- port: 9042
selector:
app: cassandra
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: cassandra
labels:
app: cassandra
spec:
serviceName: cassandra
replicas: 3
selector:
matchLabels:
app: cassandra
template:
metadata:
labels:
app: cassandra
spec:
terminationGracePeriodSeconds: 1800
containers:
- name: cassandra
image: gcr.io/google-samples/cassandra:v13
imagePullPolicy: Always
ports:
- containerPort: 7000
name: intra-node
- containerPort: 7001
name: tls-intra-node
- containerPort: 7199
name: jmx
- containerPort: 9042
name: cql
resources:
limits:
cpu: "500m"
memory: 1Gi
requests:
cpu: "500m"
memory: 1Gi
securityContext:
capabilities:
add:
- IPC_LOCK
lifecycle:
preStop:
exec:
command:
- /bin/sh
- -c
- nodetool drain
env:
- name: MAX_HEAP_SIZE
value: 512M
- name: HEAP_NEWSIZE
value: 100M
- name: CASSANDRA_SEEDS
value: "cassandra-0.cassandra.default.svc.cluster.local"
- name: CASSANDRA_CLUSTER_NAME
value: "K8Demo"
- name: CASSANDRA_DC
value: "DC1-K8Demo"
- name: CASSANDRA_RACK
value: "Rack1-K8Demo"
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
readinessProbe:
exec:
command:
- /bin/bash
- -c
- /ready-probe.sh
initialDelaySeconds: 15
timeoutSeconds: 5
volumeMounts:
- name: cassandra-data
mountPath: /cassandra_data
volumeClaimTemplates:
- metadata:
name: cassandra-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: default-storageclass
resources:
requests:
storage: 1Gi
在应用之后,你可以看到通过Lens创建的StatefulSet、服务、pod和其他资源。
你可以查看正在为Pod更新的实时日志,这对于故障排除非常宝贵。所有的事件也记录在同一页上,这是你看到以下的输出:
kubectl describe pod cassandra-0
这些绝对是很好的工具,可以在部署期间为你节省很多麻烦和时间。
此外,你还可以在同一个页面上从pod进入shell。
如果你还是不满意,Lens还提供了创建、更新和删除资源的选项,可以直接从GUI和内置终端中创建、更新和删除资源,内置终端会自动切换到正确的上下文。
让我们继续部署一个ReplicaSet来启动三个nginx pod。这将部署在“nginx”命名空间,它也是从Lens创建的。
RBAC授权
支持Kubernetes RBAC,这意味着通过Lens连接到Kubernetes集群的个人用户只能与他们被允许的资源进行交互。
在下面的图片中,你可以看到域用户nimal@emea.nutanix.com已经导入了他的kubeconfig文件,但是他没有权限列出任何pod。
apiVersion: v1
kind: Namespace
metadata:
name: sre
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: sre
name: sre-role
rules:
- apiGroups: ["", "apps", "batch", "extensions"]
resources: ["services", "endpoints", "pods", "deployments"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
namespace: sre
name: sre-role-binding
subjects:
- kind: User
name: nimal@emea.nutanix.com
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: sre-role
apiGroup: rbac.authorization.k8s.io
集群管理员部署以下YAML文件,为该用户nimal@emea.nutanix.com创建角色sre-role和RoleBinding sre-role-binding。
apiVersion: v1
kind: Namespace
metadata:
name: sre
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: sre
name: sre-role
rules:
- apiGroups: ["", "apps", "batch", "extensions"]
resources: ["services", "endpoints", "pods", "deployments"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
namespace: sre
name: sre-role-binding
subjects:
- kind: User
name: nimal@emea.nutanix.com
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: sre-role
apiGroup: rbac.authorization.k8s.io
接下来,我们看到用户被授权执行如下所示的相同操作。
总结
Kubernetes是一个具有快速扩展功能集的复杂平台。能够在整个生命周期中简化Kubernetes管理的工具和技术能够最好地服务于用户。Lens具有丰富的功能和仪表板,为Kubernetes管理提供了简化多云管理的有效方法。它只需要很少的学习,在多个Kubernetes集群之间提供简单的上下文切换、实时集群状态可视化,甚至使用标准Kubernetes API强制执行RBAC安全性。Lens可以显著提高生产率,并且是在多云配置中管理Kubernetes集群的最佳选择!
关于作者
客座文章作者:Nimal Kunnath,Nutanix系统可靠性工程师
Nimal Kunnath是Nutanix的系统可靠性工程师。他拥有超过6年的数据中心产品经验,目前从事企业云服务,包括虚拟化、数据存储、网络、容器化和分布式系统。
来源:oschina
链接:https://my.oschina.net/u/2306127/blog/4892311