Nginx Kubernetes(k8s)集群部署详解
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 接口信息
用如下命令可以查看主节点运行 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.yamlkubernetes-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。