快速部署一个K8s集群
生产环境部署K8s的2种方式
kubeadm
Kubeadm是一个工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。
部署地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
二进制
推荐,从官方下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。
下载地址:https://github.com/kubernetes/kubernetes/releases
服务器硬件配置推荐
使用kubeadm快速部署一个K8s集群
192.168.0.11/24 | 192.168.0.12/24 | 192.168.0.13/24 |
---|---|---|
k8s-master | k8s-node1 | k8s-node2 |
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。
这个工具能通过两条指令完成一个kubernetes集群的部署:
# 创建一个 Master 节点 |
master:kube-apiserver、scheduler、controller-manager、etcd
node:kubelet(非容器化)、kube-proxy
kubeadm不单纯是简化部署k8s集群,采用了容器化方式部署k8s组件。
1. 安装要求
在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
-
一台或多台机器,操作系统 CentOS7.x-86_x64
-
硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
-
集群中所有机器之间网络互通
-
可以访问外网,需要拉取镜像
-
禁止swap分区
2. 准备环境
关闭防火墙:
$ systemctl stop firewalld |
关闭selinux:
$ sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久 |
关闭swap:
$ swapoff -a # 临时 |
设置主机名:
$ hostnamectl set-hostname <hostname> |
在master添加hosts:
$ cat >> /etc/hosts << EOF |
将桥接的IPv4流量传递到iptables的链:
$ cat > /etc/sysctl.d/k8s.conf << EOF |
时间同步:
$ yum install ntpdate -y |
3. 安装Docker/kubeadm/kubelet【所有节点】
Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。
3.1 安装Docker
$ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo |
配置镜像下载加速器:
$ cat > /etc/docker/daemon.json << EOF |
3.2 添加阿里云YUM软件源
$ cat > /etc/yum.repos.d/kubernetes.repo << EOF |
3.3 安装kubeadm,kubelet和kubectl
由于版本更新频繁,这里指定版本号部署:
$ yum install -y kubelet-1.19.0 kubeadm-1.19.0 kubectl-1.19.0 |
4. 部署Kubernetes Master
https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/#config-file
在192.168.0.11(Master)执行。
$ kubeadm init \ |
-
–apiserver-advertise-address 集群通告地址
-
–image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
-
–kubernetes-version K8s版本,与上面安装的一致
-
–service-cidr 集群内部虚拟网络,Pod统一访问入口
-
–pod-network-cidr Pod网络,,与下面部署的CNI网络组件yaml中保持一致
kubeadm init初始化工作:
1、[preflight] 环境检查和拉取镜像 kubeadm config /images pull
2、[certs] 生成k8s证书和etcd证书 /etc/kubernetes/pki
3、[kubeconfig] 生成kubeconfig文件
4、[kubelet-start] 生成kubelet配置文件
5、[control-plane] 部署管理节点组件,用镜像启动容器 kubectl get pods -n kube-system
6、[etcd] 部署etcd数据库,用镜像启动容器
7、[upload-config] [kubelet] [upload-certs] 上传配置文件到k8s中
8、[mark-control-plane] 给管理节点添加一个标签 node-role.kubernetes.io/master=‘’,再添加一个污点[node-role.kubernetes.io/master:NoSchedule]
9、[bootstrap-token] 自动为kubelet颁发证书
10、[addons] 部署插件,CoreDNS、kube-proxy
或者使用配置文件引导:
$ vi kubeadm.conf |
拷贝kubectl使用的连接k8s认证文件到默认路径:
mkdir -p $HOME/.kube |
5. 加入Kubernetes Node
在192.168.0.11/12(Node)执行。
向集群添加新节点,执行在kubeadm init输出的kubeadm join命令:
kubeadm join 192.168.0.11:6443 --token dq52g0.m44tucwrwwyieklo \ |
默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,操作如下:
$ kubeadm token create |
或者直接命令快捷生成:kubeadm token create --print-join-command
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-join/
6. 部署容器网络(CNI)
注意:只需要部署下面其中一个,推荐Calico。
Calico是一个纯三层的数据中心网络方案,Calico支持广泛的平台,包括Kubernetes、OpenStack等。
Calico 在每一个计算节点利用 Linux Kernel 实现了一个高效的虚拟路由器( vRouter) 来负责数据转发,而每个 vRouter 通过 BGP 协议负责把自己上运行的 workload 的路由信息向整个 Calico 网络内传播。
此外,Calico 项目还实现了 Kubernetes 网络策略,提供ACL功能。
https://docs.projectcalico.org/getting-started/kubernetes/quickstart
$ wget https://docs.projectcalico.org/manifests/calico.yaml |
下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init指定的一样
修改完后应用清单:
$ kubectl apply -f calico.yaml |
7. 测试kubernetes集群
-
验证Pod工作
-
验证Pod网络通信
-
验证DNS解析
在Kubernetes集群中创建一个pod,验证是否正常运行:
$ kubectl create deployment nginx --image=nginx |
访问地址:http://NodeIP:Port
8. 部署 Dashboard
$ wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml |
默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:
$ vi recommended.yaml |
访问地址:https://NodeIP:30001
创建service account并绑定默认cluster-admin管理员集群角色:
# 创建用户 |
使用输出的token登录Dashboard。
K8s CNI网络模型
K8s是一个扁平化网络。
即所有部署的网络组件都必须满足如下要求:
-
一个Pod一个IP
-
所有的 Pod 可以与任何其他 Pod 直接通信
-
所有节点可以与所有 Pod 直接通信
-
Pod 内部获取到的 IP 地址与其他 Pod 或节点与其通信时的 IP 地址是同一个
主流网络组件有:Flannel、Calico等
查看集群状态
查看master组件状态:
kubectl get cs |
查看node状态:
kubectl get node |
查看Apiserver代理的URL:
kubectl cluster-info |
查看集群详细信息:
kubectl cluster-info dump |
查看资源信息:
kubectl describe <资源> <名称> |