环境准备
本次指定Kubernetes 1.18.20版本,Docker-CE 19.03版本
本次我们搭建一主两从的k8s集群,共需要3台Ubuntu 20.04 LTS Server版的虚拟机。
机器分配如下
| IP | 主机名 | 角色 |
|---|---|---|
| 172.16.83.131 | k8s-master-01 | master |
| 172.16.83.132 | k8s-node-01 | slave-1 |
| 172.16.83.133 | K8s-node-02 | slave-2 |
环境设置
一下命令所有机器都需要执行
- 安装必要的工具
$ sudo apt-get update
$ sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common vim ntpdate
- 主机名解析
$ cat >> /etc/hosts <<EOF
172.16.83.131 k8s-master-01
172.16.83.132 k8s-node-01
172.16.83.133 k8s-node-02
EOF
- 同步时间
$ ntpdate ntp.aliyun.com
- 禁用swap
$ swapoff -a
$ sed -ri 's/.* swap.*/# &/' /etc/fstab
- 允许 iptables 检查桥接流量
$ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
$ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sysctl --system
安装Docker
- 安装Docker
$ curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get -y update
$ sudo apt-get -y install docker-ce=5:19.03.15~3-0~ubuntu-focal
- Docker 镜像源配置
$ mkdir -p /etc/docker
$ tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
- 重启Docker
$ systemctl daemon-reload
$ systemctl restart docker
$ systemctl enable docker
安装Kubeadm并初始化集群
- 安装 kubelet kubeadm kubectl
$ curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
$ cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
$ apt update
$ apt-get install kubeadm=1.18.20-00 kubectl=1.18.20-00 kubelet=1.18.20-00 -y
$ systemctl enable kubelet // 开机启动
- Init Master
这里apiserver-advertise-address 填写master节点IP
$ kubeadm init \
--apiserver-advertise-address=172.16.83.131 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.18.20 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--token-ttl=0
- 设定kubectl
$ mkdir -p $HOME/.kube
$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ chown $(id -u):$(id -g) $HOME/.kube/config
- 从节点加入
(备用)生成join token
$ kubeadm token create --print-join-comman
$ kubeadm join 172.16.83.131:6443 --token 83r0bn.0aqqga8vpupvopwm \
> --discovery-token-ca-cert-hash sha256:f74dc8b9357decae48d7ce6d339aad696488553e67a3546225bf9c77325fc7b6
- 部署网络插件
$ wget https://docs.projectcalico.org/manifests/calico.yaml
修改为之前配置的 pod-network-cidr
3654 - name: CALICO_IPV4POOL_CIDR
3655 value: "10.244.0.0/16"
$ kubectl apply -f calico.yaml
这一步需要拉取镜像,有可能失败,我也是等了好久,3个节点才成功
到这一步,就部署完成了。
$ kubectl get nodes
测试
这里我们部署一个Nginx Service
$ kubectl create deployment nginx --image=nginx
部署过程需要拉取镜像,需要一段时间。甚至会失败,耐心等待即可。
如果部署失败且一直无响应,可以删除Pod,Deployment会自动重新搭建。
$ kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 22m
$ kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort
service/nginx expose
$ kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-f89759699-f66k7 1/1 Running 0 6m54s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 49m
service/nginx NodePort 10.106.41.127 <none> 80:32231/TCP 12s
到这里就部署好了Nginx Service 并暴露了集群的端口。
部署Dashboard
- 下载配置文件
$ wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
- 修改配置文件
$ vim recommended.yaml
这里暴露出30000 — 32767 之间的任意端口,一定要通过https访问!
- 部署
$ kubectl apply -f recommended.yaml
# 验证
$ kubectl get pod -n kubernetes-dashboard -l k8s-app=kubernetes-dashboard
NAME READY STATUS RESTARTS AGE
kubernetes-dashboard-7f99b75bf4-6nbv8 1/1 Running 0 37m
- 创建登录Token
# 创建用户
$ kubectl create serviceaccount dashboard-admin -n kube-system
# 用户授权
$ kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
# 获取用户token
$ kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
- 访问