利刃出鞘 Ubuntu 20.04 LTS 部署 Kubernetes 集群

774 阅读1分钟

环境准备

本次指定Kubernetes 1.18.20版本,Docker-CE 19.03版本

本次我们搭建一主两从的k8s集群,共需要3台Ubuntu 20.04 LTS Server版的虚拟机。

机器分配如下

IP主机名角色
172.16.83.131k8s-master-01master
172.16.83.132k8s-node-01slave-1
172.16.83.133K8s-node-02slave-2

1.png

环境设置

一下命令所有机器都需要执行

  1. 安装必要的工具
$ sudo apt-get update
$ sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common vim ntpdate
  1. 主机名解析
$ 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
  1. 同步时间
$ ntpdate ntp.aliyun.com
  1. 禁用swap
$ swapoff -a
$ sed -ri 's/.* swap.*/# &/' /etc/fstab
  1. 允许 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

  1. 安装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
  1. Docker 镜像源配置
$ mkdir -p /etc/docker

$ tee /etc/docker/daemon.json <<-'EOF'
{
 "registry-mirrors": ["https://registry.docker-cn.com"],
 "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
  1. 重启Docker
$ systemctl daemon-reload
$ systemctl restart docker
$ systemctl enable docker

安装Kubeadm并初始化集群

  1. 安装 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 // 开机启动
  1. 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

504aeceb08b5a8804810e06d1c3e6930.png

  1. 设定kubectl
$ mkdir -p $HOME/.kube

$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

$ chown $(id -u):$(id -g) $HOME/.kube/config
  1. 从节点加入

(备用)生成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

企业微信截图_b209463e-bf40-4463-b0e4-789d1044435d.png

  1. 部署网络插件
$ 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

企业微信截图_4d6f355a-6w044-4411-bc8a-a305ccfc4aa1.png

这一步需要拉取镜像,有可能失败,我也是等了好久,3个节点才成功

到这一步,就部署完成了。

$ kubectl get nodes

企业微信截图_677016aa-dab5-48fd-8a76-2e6201f56a4c.png

测试

这里我们部署一个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

ec5834c669801a4b57a1d66fb057ee30.png

到这里就部署好了Nginx Service 并暴露了集群的端口。

2.png

部署Dashboard

  1. 下载配置文件
$ wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
  1. 修改配置文件
$ vim recommended.yaml

e85019a5b208ad22e3e7128fdcc925d1.png

这里暴露出30000 — 32767 之间的任意端口,一定要通过https访问!

3.png

  1. 部署
$ 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
  1. 创建登录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}')
  1. 访问

4.png