2025年3月12日 星期三 甲辰(龙)年 月十一 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 服务器 > Nginx

Kubernetes(k8s)集群部署详解

时间:02-11来源:作者:点击数:160

Kubernetes 集群支持多种方式部署,kubeadm 是 Kubernetes 官方提供的用于快速部署 Kubernetes 集群的工具,本节将使用 kubeadm 实现 Kubernetes 集群样例的快速部署。部署规划如下表所示。

名称 IP 主机名
Master 节点 10.10.4.17 vm417centos-master.kube
从节点 10.10.4.26 vm426centos-node01.kube
Pod 网络 172.172.0.0/16 --

1、系统初始化

分别在 Master 和 Node 主机进行系统初始化,此处使用的操作系统版本为 CentOS 7.2。

  • # 关闭setenforce
  • setenforce 0
  • sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
  • # 关闭默认防火墙
  • systemctl stop firewalld
  • systemctl disable firewalld
  • # 配置hosts,实现本地主机名解析
  • echo "10.10.4.17 vm417centos-master.kube
  • 10.10.4.26 vm426centos-node01.kube" >> /etc/hosts
  • # 配置系统内核参数,因网桥工作于数据链路层,数据默认会直接经过网桥转发,为避免iptables的FORWARD
  • # 设置失效,需要启用bridge-nf机制
  • cat <<EOF > /etc/sysctl.d/k8s.conf
  • net.bridge.bridge-nf-call-ip6tables = 1
  • net.bridge.bridge-nf-call-iptables = 1
  • net.ipv4.ip_forward = 1
  • vm.swappiness=0
  • EOF
  • # 使内核参数配置生效
  • sysctl --system
  • # 关闭交换内存,如果不关闭,kubelet服务将无法启动
  • swapoff -a
  • # 安装docker-ce,Kubernetes与Docker存在版本兼容问题,Kubernetes最新版本v1.15,最高支持
  • # Docker 18.09版本,所以需要安装指定的Docker版本
  • yum install -y yum-utils
  • yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  • yum install -y docker-ce-18.09.0-3.el7 docker-ce-cli-18.09.0-3.el7 containerd.io-1.2.0-3.el7 ebtables ethtool
  • systemctl enable docker
  • systemctl start docker
  • # 优化Docker cgroup驱动,Kubernetes文档指出,使用systemd作为init system的Linux系统中,
  • # cgroup driver为systemd模式可以确保服务器节点在资源紧张时的稳定性
  • yum install -y systemd
  • cat >/etc/docker/daemon.json<<EOF
  • {
  • "exec-opts": ["native.cgroupdriver=systemd"]
  • }
  • EOF
  • systemctl restart docker
  • # 查看确认
  • docker info | grep Cgroup
  • # 配置kubernetes yum源,用以安装Kubernetes基础服务及工具,此处使用阿里云镜像仓库源
  • cat > /etc/yum.repos.d/kubernetes.repo <<EOF
  • [kubernetes]
  • name=Kubernetes
  • baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
  • enabled=1
  • gpgcheck=0
  • EOF
  • # 安装Kubernetes基础服务及工具
  • yum install -y kubeadm kubelet kubectl kompose kubernetes-cni
  • systemctl enable kubelet.service

2、部署Master节点

Master 节点理论上只需要接口服务、调度服务、控制管理服务、状态存储服务,但 kubeadm 以 Pod 形式部署 Master 组件,所以在 Master 节点主机上仍需要部署 kubelet 服务,kubeadm 在初始化时会自动对 kubelet 服务进行配置和管理。

  • # 设置主机名,kubeadm识别主机名时有严格的规范,主机名中需要有“-”或“.”
  • hostnamectl --static set-hostname vm417centos-master.kube
  • # 使用kubeadm初始化Master节点,建议使用阿里云镜像仓库
  • kubeadm init --pod-network-cidr=172.172.0.0/16 \ # 设置Pod网段IP为172.172.0.0/16
  • --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \    # 设置从阿里云镜像仓库下载
  • --kubernetes-version v1.15.1 # 下载Kubernetes的v1.15.1版本

Master 节点初始化成功后,会提示成功并输出 token 和 discovery-token-ca-cert-hash,用于将 Node 加入所指定 Master 的 Kubernetes 集群。Kubernetes 本身并没有集成网络功能,需要单独安装网络插件实现 Kubernetes 集群中 Pod 的网络功能,此处安装网络组件 Flannel。

  • # 初始化kubectl配置,建议在非root或单独的管理机上配置kubectl管理环境
  • echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
  • source ~/.bash_profile
  • # 获取网络组件Flannel的资源配置文件
  • wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  • # 修改Pod网段IP为自定义的172.172.0.0/16
  • sed -i "s#10.244.0.0/16#172.172.0.0/16#g" kube-flannel.yml
  • # 创建应用
  • kubectl apply -f kube-flannel.yml

网络组件安装后,可以在网络接口上看到 cni0 和 flannel.1,如下图所示。

Flannel 接口信息
图:Flannel 接口信息

用如下命令可以查看主节点运行 Pod 的状态。

kubectl get pods --all-namespaces -o wide

3、部署Node

  • # 设置主机名,kubeadm识别主机名时有严格的规范,主机名中需要有“-”或“.”
  • hostnamectl --static set-hostname vm426centos-node01.kube
  • # 加入Kubernetes集群
  • kubeadm join 10.10.4.17:6443 --token rk1zux.esj6fnjz3xlms3rv \
  • --discovery-token-ca-cert-hash sha256:f8371d489b9f67f630199a03754ceffa83d850f06db039a60fc9b170c20e5826
  • # 在Master节点通过命令查看节点状态
  • kubectl get nodes

4、部署kubernetes-dashboard

kubernetes-dashboard 是 Kubernetes 社区中一个很受欢迎的项目,它为 Kubernetes 用户提供了一个可视化的 Web 前端,通过 Web 前端可以查看当前集群的各种信息,为用户管理维护 Kubernetes 集群提供帮助。

  • # 获取资源配置文件
  • wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
  • # 修改镜像仓库为阿里云仓库
  • sed -i "s/k8s.gcr.io/registry.cn-hangzhou.aliyuncs.com\/google_containers/g" kubernetes-dashboard.yaml
  • # 设置端口映射方式为NodePort,映射端口为31443
  • sed -i '/spec:/{N;s/ ports:/ type: NodePort\n&/g}' kubernetes-dashboard.yaml
  • sed -i "/targetPort: 8443/a\ nodePort: 31443" kubernetes-dashboard.yaml
  • # 部署Pod应用
  • kubectl apply -f kubernetes-dashboard.yaml

kubernetes-dashboard 有 Kubeconfig 和 Token 两种认证登录方式,此处选择 Token 方式认证登录。此处 Kubernetes 的资源类型——服务账户(Service Account)创建 admin-user 账户并授权为 Cluster-Role 的管理角色。

  • # 创建admin-user账户及授权的资源配置文件
  • cat>dashboard-adminuser.yml<<EOF
  • apiVersion: v1
  • kind: ServiceAccount
  • metadata:
  • name: admin-user
  • namespace: kube-system
  • ---
  • 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: kube-system
  • EOF
  • # 创建资源实例
  • kubectl create -f dashboard-adminuser.yml
  • # 获取账户admin-user的Token用于登录
  • kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

kubernetes-dashboard 的 Pod 运行成功后,可以在浏览器上通过集群中的任意 Node IP 和 31443 端口访问 kubernetes-dashboard,通过 Token 登录后就可以通过 Web 界面进行 Kubernetes 集群的管理和维护。

5、部署管理工具Helm

Helm 客户端程序需要使用 Kubernetes 管理工具 kubectl,所以要先确认安装 Helm 主机的 kubectl 可用,如果不可用则需要先安装。

1) 安装kubectl

配置样例如下:

  • # 配置Kubernetes安装源
  • cat > /etc/yum.repos.d/kubernetes.repo <<EOF
  • [kubernetes]
  • name=Kubernetes
  • baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
  • enabled=1
  • gpgcheck=0
  • EOF
  • # 安装kubectl
  • yum install -y kubectl
  • # 初始化配置目录
  • mkdir -p $HOME/.kube
  • # 将Master节点主机的文件/etc/kubernetes/admin.conf复制到kubectl控制机
  • scp Master:/etc/kubernetes/admin.conf $HOME/.kube/config

2) 安装Helm

配置样例如下:

  • # 下载Helm客户端
  • wget https://get.helm.sh/helm-v2.14.2-linux-amd64.tar.gz
  • tar -zxvf helm-v2.14.2-linux-amd64.tar.gz
  • mv linux-amd64/helm /usr/sbin/
  • mv linux-amd64/tiller /usr/sbin/
  • helm help
  • # 添加阿里云仓库
  • helm repo add aliyun-stable https://acs-k8s-ingress.oss-cn-hangzhou.aliyuncs.com/charts
  • helm repo update
  • # 将Tiller应用安装到Kubernetes集群并使用阿里云的charts仓库
  • helm init --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.2 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
  • # 添加Tiller授权
  • kubectl create serviceaccount --namespace kube-system tiller
  • kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
  • kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template": {"spec":{"serviceAccount":"tiller"}}}}'

3) 安装Helm的Web管理工具Kubeapps

Kubeapps 是 Helm 的 Web 化管理工具,提供了比命令行更丰富的应用安装说明和更便捷的安装方式。

  • # 添加bitnami的charts仓库
  • helm repo add bitnami https://charts.bitnami.com/bitnami
  • # 安装Kubeapps,命名为kubeapps,所属命名空间为kubeapps
  • helm install --namespace kubeapps --name kubeapps bitnami/kubeapps
  • # 创建Kubeapps账号
  • kubectl create serviceaccount kubeapps-operator
  • kubectl create clusterrolebinding kubeapps-operator --clusterrole=cluster-admin --serviceaccount=default:kubeapps-operator
  • # 创建服务,提供NodePort类型的访问端口30080
  • cat>kubeapps-service.yml<<EOF
  • apiVersion: v1
  • kind: Service
  • metadata:
  • name: kubeapps-svc
  • namespace: kubeapps
  • labels:
  • app: kubeapps
  • spec:
  • type: NodePort
  • ports:
  • - port: 8080
  • nodePort: 30080
  • selector:
  • app: kubeapps
  • EOF
  • # 在集群中创建资源实例
  • kubectl create -f kubeapps-service.yml
  • # 获取登录token
  • kubectl get secret $(kubectl get serviceaccount kubeapps-operator -o jsonpath= '{.secrets[].name}') -o jsonpath='{.data.token}' | base64 --decode

在浏览器上通过端口 30080 就可以访问应用 Kubeapps。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门