本文详细介绍了如何在Ubuntu 22.04操作系统上搭建Kubernetes(简称k8s)1.30.1版本的集群。内容涵盖了开启Dashboard 2.7.0和部署ingress-nginx 1.10.1的步骤,旨在帮助用户构建一个功能完备的k8s集群。全文超过两万字,提供了详尽的操作指南和说明。
Ubuntu, Kubernetes, 集群, Dashboard, ingress
Kubernetes,通常简称为k8s,是一个开源的容器编排平台,旨在自动化应用程序的部署、扩展和管理。自2014年首次发布以来,Kubernetes已经成为云原生计算领域的标准工具之一。它通过提供一个统一的平台,使得开发人员和运维人员能够更高效地管理和扩展容器化应用。Kubernetes的核心优势在于其强大的自动化能力和高度的可扩展性,这使得它在处理大规模分布式应用时表现出色。
在Kubernetes集群中,节点(Node)是运行容器化应用的基本单位。每个节点可以是一台物理机或虚拟机,它们通过网络连接在一起,形成一个集群。集群中的主节点(Master Node)负责管理和调度工作负载,而工作节点(Worker Node)则负责运行实际的应用容器。Kubernetes通过一系列的API和服务,确保应用的高可用性和弹性,从而为企业提供了一个可靠的基础设施平台。
在开始搭建Kubernetes集群之前,首先需要确保所有节点都运行在相同的操作系统环境中。本文选择使用Ubuntu 22.04作为基础操作系统,因为它具有良好的稳定性和广泛的社区支持。以下是详细的系统环境准备步骤:
首先,确保所有节点的操作系统是最新的。打开终端并执行以下命令:
sudo apt update && sudo apt upgrade -y
这一步骤将更新系统的软件包列表,并安装所有可用的更新,确保系统处于最佳状态。
接下来,安装一些Kubernetes所需的依赖项。这些依赖项包括Docker、kubectl、kubeadm和kubelet。Docker是Kubernetes的默认容器运行时,而kubectl、kubeadm和kubelet则是Kubernetes的核心组件。
sudo apt install docker.io -y
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo bash -c 'cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF'
sudo apt update
sudo apt install -y kubectl
sudo apt install -y kubelet kubeadm
为了确保Kubernetes能够正常运行,需要对内核参数进行一些配置。编辑 /etc/sysctl.conf
文件,添加以下内容:
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
然后,应用这些配置:
sudo sysctl -p
Kubernetes不支持启用Swap分区,因此需要禁用它。编辑 /etc/fstab
文件,注释掉Swap相关的行,然后重启系统以应用更改:
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
sudo reboot
通过以上步骤,您已经为搭建Kubernetes集群做好了充分的系统环境准备。接下来,我们将进入Kubernetes集群的具体搭建步骤。
在完成了系统环境的准备工作之后,接下来的步骤是安装Kubernetes 1.30.1版本。这一过程涉及初始化主节点和加入工作节点,确保整个集群能够正常运行。以下是详细的安装步骤:
kubeadm
命令初始化Kubernetes集群。执行以下命令:sudo kubeadm init --pod-network-cidr=10.244.0.0/16
10.244.0.0/16
。初始化过程中,kubeadm
会下载必要的镜像并配置集群。kubeadm
会输出一些重要的信息,包括如何配置 kubectl
以便与集群进行交互。按照提示,执行以下命令:mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
admin.conf
文件复制到 ~/.kube/config
,并设置适当的权限,使当前用户能够使用 kubectl
。kubectl
命令验证集群的状态:kubectl get nodes
Ready
。kubeadm
会输出一个用于加入工作节点的命令。该命令类似于以下形式:kubeadm join <master-ip>:<master-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
kubeadm join
命令。例如:sudo kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
kubectl
命令验证所有节点的状态:kubectl get nodes
Ready
,表示集群已经成功搭建。在Kubernetes集群中,网络配置是至关重要的一步。正确的网络配置确保了Pod之间的通信以及外部访问的畅通。本文推荐使用Flannel作为网络插件,因为它简单易用且性能良好。
kubectl
命令应用Flannel网络插件:kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl
命令验证Flannel网络插件的状态:kubectl get pods -n kube-system
kube-flannel-ds
相关的Pod处于 Running
状态,表示网络插件已成功安装并运行。test-pod.yaml
的文件,内容如下:apiVersion: v1
kind: Pod
metadata:
name: test-pod
namespace: default
spec:
containers:
- name: test-container
image: nginx
kubectl
命令创建并查看Pod的状态:kubectl apply -f test-pod.yaml
kubectl get pods test-pod
Running
,并且能够访问其内部服务,说明网络配置正确。ingress-nginx
作为Ingress控制器。kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.1/deploy/static/provider/cloud/deploy.yaml
ingress-nginx
的配置文件,启动Ingress控制器。通过以上步骤,您已经成功安装并配置了Kubernetes 1.30.1版本的集群,并确保了网络的正确配置。接下来,我们将继续探讨如何开启Dashboard 2.7.0和部署ingress-nginx 1.10.1,进一步完善您的Kubernetes集群。
在成功搭建了Kubernetes 1.30.1版本的集群并配置了网络之后,下一步是开启Kubernetes Dashboard 2.7.0。Kubernetes Dashboard 是一个通用的、基于Web的UI,用于管理和监控Kubernetes集群。它提供了丰富的可视化界面,使得用户可以轻松地管理集群资源、查看应用状态和执行常见操作。以下是开启Dashboard的详细步骤:
kubectl
命令安装Kubernetes Dashboard。执行以下命令:kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
kubectl
命令验证Dashboard的状态:kubectl get pods -n kubernetes-dashboard
kubernetes-dashboard
相关的Pod处于 Running
状态,表示Dashboard已成功安装并运行。admin-user.yaml
的文件,内容如下:apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
kubectl
命令创建管理员用户:kubectl apply -f admin-user.yaml
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"
kubectl
命令启动一个代理,以便通过本地浏览器访问Dashboard:kubectl proxy
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
为了确保Kubernetes Dashboard的安全性,配置访问权限是非常重要的一步。通过合理的权限管理,可以防止未经授权的用户访问敏感信息和执行危险操作。以下是配置Dashboard访问权限的详细步骤:
readonly-user.yaml
的文件,内容如下:apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: kubernetes-dashboard
name: readonly-user
rules:
- apiGroups: [""]
resources: ["pods", "services", "deployments"]
verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: readonly-user-binding
namespace: kubernetes-dashboard
subjects:
- kind: User
name: readonly-user
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: readonly-user
apiGroup: rbac.authorization.k8s.io
kubectl
命令创建只读用户角色和绑定:kubectl apply -f readonly-user.yaml
readonly-secret.yaml
的文件,内容如下:apiVersion: v1
kind: Secret
metadata:
name: readonly-user-token
namespace: kubernetes-dashboard
type: Opaque
data:
token: <base64-encoded-token>
<base64-encoded-token>
是一个Base64编码的令牌。您可以使用以下命令生成一个随机令牌并进行Base64编码:head -c 16 /dev/urandom | base64
readonly-secret.yaml
文件中,然后使用 kubectl
命令创建秘密:kubectl apply -f readonly-secret.yaml
通过以上步骤,您不仅开启了Kubernetes Dashboard 2.7.0,还配置了合理的访问权限,确保了集群的安全性和管理的便捷性。接下来,我们将继续探讨如何部署ingress-nginx 1.10.1,进一步完善您的Kubernetes集群。
在Kubernetes集群中,Ingress控制器是实现外部访问的关键组件。通过Ingress控制器,可以将外部流量路由到集群内的不同服务,从而实现灵活的负载均衡和路由管理。本文推荐使用 ingress-nginx
1.10.1 版本,它是一个高性能、功能丰富的Ingress控制器,广泛应用于生产环境。以下是安装 ingress-nginx
的详细步骤:
kubectl
命令安装 ingress-nginx
。执行以下命令:kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.1/deploy/static/provider/cloud/deploy.yaml
ingress-nginx
的配置文件,启动Ingress控制器。kubectl
命令验证 ingress-nginx
的状态:kubectl get pods -n ingress-nginx
ingress-nginx-controller
相关的Pod处于 Running
状态,表示 ingress-nginx
已成功安装并运行。ingress-nginx
,需要配置一个LoadBalancer服务。编辑 ingress-nginx
的Service配置文件,确保其类型为 LoadBalancer
。可以在 ingress-nginx
的配置文件中找到相应的Service定义,或者直接使用以下命令:kubectl edit svc ingress-nginx-controller -n ingress-nginx
type
字段设置为 LoadBalancer
:apiVersion: v1
kind: Service
metadata:
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: 80
- name: https
port: 443
targetPort: 443
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
ingress-nginx
服务。kubectl
命令获取 ingress-nginx
的外部IP地址:kubectl get svc ingress-nginx-controller -n ingress-nginx
ingress-nginx
服务的外部IP地址,例如:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.96.0.1 192.168.1.100 80:30000/TCP,443:30001/TCP 5m
通过以上步骤,您已经成功安装并配置了 ingress-nginx
1.10.1,为外部访问Kubernetes集群中的服务奠定了基础。接下来,我们将继续探讨如何配置Ingress路由规则,实现灵活的流量管理。
Ingress路由规则是 ingress-nginx
的核心功能之一,通过配置这些规则,可以将外部流量精确地路由到集群内的不同服务。以下是如何配置Ingress路由规则的详细步骤:
example-ingress.yaml
的文件,定义Ingress资源。假设您有一个名为 web-app
的服务,监听端口80,域名 example.com
。文件内容如下:apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
namespace: default
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-app
port:
number: 80
kubectl
命令创建Ingress资源:kubectl apply -f example-ingress.yaml
kubectl
命令验证Ingress资源的状态:kubectl get ingress example-ingress -n default
NAME CLASS HOSTS ADDRESS PORTS AGE
example-ingress <none> example.com 192.168.1.100 80, 443 5m
http://example.com
。如果一切配置正确,您应该能够看到 web-app
服务的响应。这表明Ingress路由规则已成功生效,外部流量已正确路由到目标服务。cert-manager
自动管理证书。首先,安装 cert-manager
:kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.8.0/cert-manager.yaml
example-tls.yaml
的文件,定义TLS证书:apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: example-tls
namespace: default
spec:
secretName: example-tls
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
dnsNames:
- example.com
kubectl
命令创建TLS证书:kubectl apply -f example-tls.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
namespace: default
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
tls:
- hosts:
- example.com
secretName: example-tls
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-app
port:
number: 80
kubectl
命令更新Ingress资源:kubectl apply -f example-ingress.yaml
通过以上步骤,您已经成功配置了Ingress路由规则,并为Ingress资源添加了SSL证书,实现了安全的外部访问。至此,您的Kubernetes集群已经具备了完整的功能,可以高效地管理和扩展容器化应用。
在成功搭建并配置了Kubernetes集群之后,监控和维护成为了确保集群稳定运行的关键环节。Kubernetes集群的复杂性要求我们不仅要关注集群的整体健康状况,还要及时发现和解决潜在的问题。以下是一些实用的监控和维护策略,帮助您更好地管理Kubernetes集群。
kubectl
命令安装Prometheus。执行以下命令:kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.56.1/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.56.1/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.56.1/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.56.1/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.56.1/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.56.1/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.56.1/bundle.yaml
kubectl
命令安装Grafana。执行以下命令:kubectl apply -f https://raw.githubusercontent.com/grafana/helm-charts/main/charts/grafana/values.yaml
kubectl apply -f https://raw.githubusercontent.com/grafana/helm-charts/main/charts/grafana/crds/crds.yaml
kubectl apply -f https://raw.githubusercontent.com/grafana/helm-charts/main/charts/grafana/crds/crds_v1.yaml
alert-rules.yaml
的文件,内容如下:groups:
- name: example
rules:
- alert: HighCpuUsage
expr: node_cpu_usage > 0.8
for: 5m
labels:
severity: critical
annotations:
summary: "High CPU usage on {{ $labels.instance }}"
description: "{{ $labels.instance }} has had high CPU usage for the last 5 minutes."
kubectl
命令应用告警规则:kubectl apply -f alert-rules.yaml
etcd
备份工具,定期备份 etcd
数据库。etcd
数据库ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key snapshot save /var/lib/etcd/backup.db
etcd
数据库ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key snapshot restore /var/lib/etcd/backup.db
kubeadm
工具,可以方便地进行集群的升级。kubeadm upgrade plan
kubeadm upgrade apply <version>
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo systemctl restart kubelet
通过以上步骤,您可以有效地监控和维护Kubernetes集群,确保其稳定运行,为您的业务提供可靠的支持。
在使用Kubernetes集群的过程中,难免会遇到各种问题。及时发现并解决问题是保持集群高效运行的关键。以下是一些常见的问题及其解决方案,帮助您快速定位和解决故障。
kubectl
命令检查节点状态:kubectl get nodes
NotReady
或 Unknown
,可能是因为节点上的某些服务出现了问题。kubelet
的日志:journalctl -u kubelet
sudo systemctl restart kubelet
kubectl drain <node-name> --ignore-daemonsets --delete-local-data
kubectl delete node <node-name>
kubeadm join
命令,重新加入集群。kubectl
命令检查Pod的状态:kubectl get pods -n <namespace>
Error
或 CrashLoopBackOff
,可能是由于配置错误或资源不足导致的。kubectl logs <pod-name> -n <namespace>
kubectl describe pod <pod-name> -n <namespace>
apiVersion: v1
kind: Pod
metadata:
name: example-pod
namespace: default
spec:
containers:
- name: example-container
image: nginx
resources:
limits:
cpu: "1"
memory: "512Mi"
requests:
cpu: "0.5"
memory: "256Mi"
kubectl
命令更新Pod配置:kubectl apply -f example-pod.yaml
kubectl
命令检查网络插件的状态:kubectl get pods -n kube-system
kube-flannel
或其他网络插件的Pod处于 Running
状态。本文详细介绍了如何在Ubuntu 22.04操作系统上搭建Kubernetes 1.30.1版本的集群,涵盖了开启Dashboard 2.7.0和部署ingress-nginx 1.10.1的步骤。通过超过两万字的详尽操作指南,读者可以逐步构建一个功能完备的k8s集群。文章首先介绍了Kubernetes的基本概念和系统环境准备,随后详细描述了集群的安装和配置过程,包括主节点和工作节点的初始化、网络配置、Dashboard的开启和ingress-nginx的部署。此外,文章还提供了集群监控与维护的策略,以及常见问题的排查与解决方案,帮助用户确保集群的稳定运行。通过本文的指导,读者不仅能够成功搭建Kubernetes集群,还能有效管理和优化集群性能,为企业的容器化应用提供强大的支持。