最新基于ubuntu20.10 server部署k8s1.21.0集群实验

ubuntu20.10 server+docker20.10.6+k8s1.21.0

1、所有节点,这里是3台vm,分别改hostname

改hostname:vi /etc/hostname

hostname k8s-master131

建议把hostname对应的IP写进/etc/hosts文件,以便dns解析

cat >> /etc/hosts <192.168.21.131 k8s-master131
192.168.21.132 k8s-node132
192.168.31.133 k8s-node133
EOF

2、所有节点,这里是3台vm,分别配置IP

192.168.21.131 k8s-master131

192.168.21.132 k8s-node132

192.168.21.133 k8s-node133

/etc/netplan,根据个人环境的不同来编辑IP,我的环境yaml文件为:00-installer-config.yaml

network:

    ethernets:

        ens3:

            addresses: [192.168.21.131/24]

            gateway4: 192.168.21.254

            nameservers:

                    addresses: [202.96.134.133,114.114.114.114]

    version: 2

3、修改为cst东八区时区,校准日期时间。

date -R

tzselect

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

sudo date -s MM/DD/YY //修改日期

sudo date -s hh:mm:ss //修改时间

在修改时间以后,修改硬件CMOS的时间

sudo hwclock --systohc

如果需要修改时间为24小时,我们可以修改/etc/default/locale,默认没有LC_TIME这个变量,我们在文件中增加一行,设置改变量如下:

cat /etc/default/locale

LANG=en_US.UTF-8

LC_TIME=en_DK.UTF-8

时间同步

ntpdate ntp.aliyun.com

4、防火墙设置

查看当前防火墙状态

  在Ubuntu中 我们使用sudo ufw status命令查看当前防火墙状态;inactive状态是防火墙关闭状态 active是开启状态。

开启防火墙

  在Ubuntu中 我们使用sudo ufw enable命令来开发防火墙 通过sudo ufw status命令查看开启防火墙后的状态为active 说明防火墙开启成功。

关闭防火墙

在Ubuntu中 我们使用sudo ufw disable命令来关闭防火墙。执行该命令之后 我们使用sudo ufw status命令来查看当前防火墙的状态 如果是inactive 说明我们的防火墙已经关闭掉了。

Ubuntu中其他常用的防火墙命令

ufw default allow/deny:外来访问默认允许/拒绝

ufw allow/deny 20:允许/拒绝 访问20端口,20后可跟/tcp或/udp,表示tcp或udp封包。

ufw allow/deny servicename:ufw从/etc/services中找到对应service的端口,进行过滤。

ufw allow proto tcp from 10.0.1.0/10 to 本机ip port 25:允许自10.0.1.0/10的tcp封包访问本机的25端口。

ufw delete allow/deny 20:删除以前定义的"允许/拒绝访问20端口"的规则

例如开启允许80端口被访问,如下图所示

5、禁用swap

sudo swapoff -a

将文件系统设置为可读写

sudo mount -n -o remount,rw /

将文件中的swap行使用#注释掉

sudo vim /etc/fstab

重启电脑或exit后再进。

reboot

6.使流量通过iptables

加载模块

sudo modprobe br_netfilter

检查是否加载

lsmod | grep br_netfilter

br_netfilter          28672  0

bridge                200704  1 br_netfilter

配置正确流量

cat <

br_netfilter

EOF

cat <

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

EOF

应用配置

sudo sysctl --system

7、docker安装

# step 1: 安装必要的一些系统工具
apt-get update
apt-get -y install apt-transport-https ca-certificates curl software-properties-common

# Step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

# Step 3: 写入软件源信息
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu$(lsb_release -cs)stable"

# Step 4: 更新并安装v20.10.0版的Docker-CE

国内源安装指定的docker版本可参考:https://blog.csdn.net/weixin_41082546/article/details/106789673

apt-get -y update

查看源力包含哪些docker版本

apt-cache madison docker-ce

安装指定的docker版本

格式为:

sudo apt-get install docker-ce=

例如:apt-get install docker-ce=5:20.10.6~3-0~ubuntu

docker version

# Step 5:配置镜像加速

mkdir -p /etc/docker

tee /etc/docker/daemon.json <<-'EOF'{"registry-mirrors": ["https://wvmqh31a.mirror.aliyuncs.com"]}EOF

.# Step 6:kubelet需要让docker容器引擎使用systemd作为CGroup的驱动,其默认值为cgroupfs,因而,我们还需要编辑docker的配置文件/etc/docker/daemon.json,添加如下内容。"exec-opts": ["native.cgroupdriver=systemd"]

因此daemon.json内容如下:

{

  "registry-mirrors": ["https://wvmqh31a.mirror.aliyuncs.com"],

  "exec-opts": ["native.cgroupdriver=systemd"]

}

# Step 7:重新加载配置文件,然后重启服务,并且设置为开机启动。

systemctl daemon-reload

systemctl restart docker

systemctlenabledocker

8、在各主机上生成kubelet和kubeadm等相关程序包的仓库,这里使用阿里云镜像源

# curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -

# cat </etc/apt/sources.list.d/kubernetes.listdeb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

# apt update

9、安装kubelet、kubeadm、kubectl,并将kubelet设置为开机启动

# apt install kubelet=1.21.0-00 kubeadm=1.21.0-00 kubectl=1.21.0-00 -y

# systemctl enable kubelet

注: 安装完成后,要确保kubeadm等程序文件的版本,这将也是后面初始化Kubernetes集群时需要明确指定的版本号

10、初始化Master节点


# kubeadm init \

--apiserver-advertise-address=192.168.21.131 \

--image-repository registry.aliyuncs.com/google_containers \

--kubernetes-version=v1.21.0 \

--service-cidr=10.96.0.0/12 \

--pod-network-cidr=10.244.0.0/16 \

--token-ttl=0

命令中的各选项简单说明如下:

--apiserver-advertise-address:apiserver通告给其它组件的IP地址,一般应该为Master节点用于集群内部通信的IP地址

--image-repository:指定要使用的镜像仓库,默认为gcr.io

kubernetes-version:kubernetes程序组件的版本号,必须要与前面安装的版本一致

--service-cidr:集群内部虚拟网络,Pod统一访问入口;service的网络地址范围,其值为CIDR格式的网络地址,默认地址为10.96.0.0/12

--pod-network-cidr:Pod网络的地址范围,其值为CIDR格式的网络地址,通常,Flannel网络插件的默认为10.244.0.0/16,Project Calico插件的默认值为192.168.0.0/16;本章使用的是calico插件,所以下面部署CNI网络插件时需要与这里设置的保持一致。

--token-ttl:共享令牌(token)的过期时长,默认为24小时,0表示永不过期;为防止不安全存储等原因导致的令牌泄露危及集群安全,建议为其设定过期时长。未设定该选项时,在token过期后,若期望再向集群中加入其它节点,可以使用如下命令重新创建token,并生成节点加入命令。

一般能顺利把k8s系统自身kube-system组件的镜像拉下来:

kube-apiserver
kube-proxy
kube-scheduler
kube-controller-manager
pause
coredns
etcd

也可以手动docker pull下来,或者重tar包导入。

这里可能回用到:
docker pull
docker tag
docker load -i

11、设定kubectl

kubectl是kube-apiserver的命令行客户端程序,实现了除系统部署之外的几乎全部的管理操作,是kubernetes管理员使用最多的命令之一。kubectl需经由API server认证及授权后方能执行相应的管理操作,kubeadm部署的集群为其生成了一个具有管理员权限的认证配置文件/etc/kubernetes/admin.conf,它可由kubectl通过默认的"$HOME/.kube/config"的路径进行加载。当然,用户也可在kubectl命令上使用--kubeconfig选项指定一个别的位置。

下面复制认证为Kubernetes系统管理员的配置文件至目标用户(例如当前用户root)的家目录下,用于kubectl连接Kubernetes集群:

# mkdir -p $HOME/.kube

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

# chown $(id -u):$(id -g) $HOME/.kube/config

12、下载calico.yaml、修改对应IP网段

wget https://docs.projectcalico.org/manifests/calico.yaml

# 下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init命令中使用的--pod-network-cidr选项指定的一样

3672            - name: CALICO_IPV4POOL_CIDR

3673              value: "10.244.0.0/16"

kubectl apply -f calico.yaml

13、确认部署网络插件的Pod正常运行状态

# kubectl get pod -n kube-system -l k8s-app=calico-node

NAME                READY  STATUS    RESTARTS  AGE

calico-node-26s88  1/1    Running  0          8m31s

calico-node-c2mpn  1/1    Running  0          8m28s

calico-node-dhhg8  1/1    Running  0          15m

14、验证master节点已经就绪

kubectl get nodes

15、添加Node节点到集群中

kubeadm join 192.168.21.131:6443 --token 19ovkd.gnzmwvarw3zocqgs \

>        --discovery-token-ca-cert-hash sha256:4109f5d6d92c94a6c36814cf0f1ae53a885369fb3d4652f67cca9b5ec436ff89

16、配置kubectl命令自动补全功能

# echo "source <(kubectl completion bash)" >> ~/.profile

17、验证

17.1 kubectl get cs;kubectl get node

17.2 kubectl create deployment nginx --image=nginx

从上面的返回结果中来看,新建的Pod转态为"Running",并且就绪。表示运行正常。

验证Pod网络通信:

17.3 kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort

如上图,已经成功的创建了service资源,并且关联到了后端的pod,现在打开浏览器,输入任意节点的IP+31665端口即可访问pod提供的应用,http://NodeIP:NodePort

    17.4 验证DNS解析

使用busybox:1.28.4镜像创建一个pod,用于dns解析上面创建的service名称

kubectl run -it --rm --image=busybox:1.28.4 sh


从上图返回的结果信息中,可以验证Kubernetes集群中的DNS服务工作正常。至此,1个Master,并附带2个Node的kubernetes集群基础设置已经部署完成,并且其核心功能可以正常使用。9、部署Dashboard

18、部署Dashboard

18.1 下载配置清单文件

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml

18.2 修改相关内容

18.3 应用配置清单文件,创建相关资源

kubectl apply -f recommended.yaml


从上面的反馈结果来看,pod运行正常,并且已经就绪。

18.4访问Dashboard

打开浏览器,输入集群中任意节点的IP以https://NodeIP:30001格式访问


18.5 生成token

root@k8s-master131:~# kubectl get ClusterRole|grep -i cluster-admin

cluster-admin                                                          2021-04-12T17:09:47Z

18.6创建service account并绑定默认cluster-admin管理员集群角色:

创建用户:

kubectl create serviceaccount dashboard-admin -n kube-system

用户授权,把dashboard-admin用户与cluster-admin管理员集群角色绑定:

kubectl create clusterrolebinding dashboard-admin-binding --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}')

也可以通过yaml文件创建:

授予Dashboard账户集群管理权限

要让dashboard可以访问集群的各种资源,需要给dashboard账户赋予权限,这一步很关键,如果你缺少这一步的话,你打开dashboard后会报很多forbidden,如下:

configmaps is forbidden: User "system:serviceaccount:kube-system:service-controller" cannot list resource "configmaps" in API group "" in the namespace "default"

close

warning

persistentvolumeclaims is forbidden: User "system:serviceaccount:kube-system:service-controller" cannot list resource "persistentvolumeclaims" in API group "" in the namespace "default"

close

warning

....

要获得管理集群的权限,新建admin-user-admin.rbac.yaml文件,内容如下

apiVersion: v1

kind: ServiceAccount

metadata:

name: admin-user

namespace: kube-system

---

# Create ClusterRoleBinding

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

执行

[root@master] ~$ kubectl create -f admin-user-admin.rbac.yaml

找到admin-user-admin的token,记下这串token,等下登录的时候会使用,这个token默认是永久的。

[root@master] ~$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')


你可能感兴趣的:(最新基于ubuntu20.10 server部署k8s1.21.0集群实验)