最近在学习k8s,一直在线上学习。决定自己搭建一个在自己本地跑的k8s环境。为了检验自己在学习成果之外,更是让自己学了会用起来。
Docker: `docker-ce 18.06`
Kubernetes: `k8s 1.13.1
1.准备三台ubuntu虚拟机(要是有三台主机的请忽略这一点),在本地搭建环境的化,推荐安装server版的没有Desktop,节省资源。可以k8s集群跑起来不太卡。
2.推荐安装xshell, xftp。这中远程控制linux的软件。在配置集群的时候方便管理虚拟机。
3. 推荐虚拟机跑在vmware 上。不太推荐VirtualBox.毕竟收费更好用一点。(手动滑稽)。
4. 最好做一步,就来一个快照,方便做错,之后回复。
附上 用xshell管理虚拟机的照片,比单个虚拟机之间来回切换好多了。
左边的是master 节点的终端 右边的是两个子节点的终端
这种教程网上一大堆,可以自己去百度一下啊,或者谷歌一下。不过,记得安装的时候把ssh安装上,要是没有安装上,请看我的另一篇,如何在Ubuntu上安装并配置ssh
1. 用root用户登录
2. 打开配置文件 /etc/cletc/cloud/cloud.cfg (每个发行版的配置文件不同,请按照自己的版本,找自己的配置文件)
3. 修改配置 perserve_hostname: true
4. 重启 让配置文件生效
1.用root用户登录
2.在/etc//编写自己的网络配置文件 我的配置文件是 /etc/netplan/50-cloud-init.yaml
network:
ethernets:
ens33:
dhcp4: false
version: 2
3. 使配置文件生效 ,并重启
netplan apply
shutdown -r now
过程和动态的一样,只不过配置文件不一样
network:
ethernets:
ens33:
addresses: [192.168.80.144/24]
dhcp4: false
gateway4: 192.168.80.131
nameservers:
addresses: [192.168.80.131]
optional: true
version: 2
静态的需要 指明ip地址 和其他网络配置 新手推荐动态获取
这一步 是为了让主机通过别名找到集群中的别的主机
编辑 /etc/hosts
把集群的主机ip 和别名 按照下面格式写下来
192.168.80.144 master
重启 让配置生效
推荐看我的另一篇 安装docker
之前这些工作做完之后,可以开始搭建k8s了,一下不具体指明的操作都是三个节点都需要执行了。
我集群主机分配具体如下:
192.168.80.144 master
192.168.80.145 node1
192.168.80.146 node2
创建配置文件sudo touch /etc/apt/sources.list.d/kubernetes.list
添加写权限
zxt@master:~$ sudo chmod 666 /etc/apt/sources.list.d/kubernetes.list
再添加,内容如下:
deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main
执行sudo apt update
更新操作系统源,开始会遇见如下错误
zxt@master:~$ sudo apt update
Get:1 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease [8,993 B]
Err:1 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 6A030B21BA07F4FB
Hit:2 http://mirrors.aliyun.com/ubuntu cosmic InRelease
Hit:3 http://mirrors.aliyun.com/ubuntu cosmic-updates InRelease
Hit:4 http://mirrors.aliyun.com/ubuntu cosmic-backports InRelease
Hit:5 http://mirrors.aliyun.com/ubuntu cosmic-security InRelease
Err:6 https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu cosmic InRelease
Could not wait for server fd - select (11: Resource temporarily unavailable) [IP: 202.141.176.110 443]
Reading package lists... Done
W: GPG error: http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 6A030B21BA07F4FB
E: The repository 'http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
其中:
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 6A030B21BA07F4FB
签名认证失败,需要重新生成。记住上面的NO_PUBKEY 6A030B21BA07F4FB
添加认证key
运行如下命令,添加错误中对应的key(错误中NO_PUBKEY后面的key的后8位)
gpg --keyserver keyserver.ubuntu.com --recv-keys BA07F4FB
接着运行如下命令,确认看到OK,说明成功,之后进行安装:
gpg --export --armor BA07F4FB | sudo apt-key add -
再次重新sudo apt update
更新系统下载源数据列表
zxt@master:~$ sudo apt update
Hit:1 https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu cosmic InRelease
Hit:2 http://mirrors.aliyun.com/ubuntu cosmic InRelease
Hit:3 http://mirrors.aliyun.com/ubuntu cosmic-updates InRelease
Hit:4 http://mirrors.aliyun.com/ubuntu cosmic-backports InRelease
Hit:5 http://mirrors.aliyun.com/ubuntu cosmic-security InRelease
Get:6 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease [8,993 B]
Ign:7 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial/main amd64 Packages
Get:7 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial/main amd64 Packages [26.6 kB]
Fetched 26.6 kB in 42s (635 B/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
165 packages can be upgraded. Run 'apt list --upgradable' to see them.
以上没有报和错误异常,表示成功。
禁止防火墙
$ sudo ufw disable
Firewall stopped and disabled on system startup
关闭swap
# 成功
$ sudo swapoff -a
# 永久关闭swap分区
$ sudo sed -i 's/.*swap.*/#&/' /etc/fstab
禁止selinux
# 安装操控selinux的命令
$ sudo apt install -y selinux-utils
# 禁止selinux
$ setenforce 0
# 重启操作系统
$ shutdown -r now
# 查看selinux是否已经关闭
$ sudo getenforce
Disabled(表示已经关闭)
(1) 配置内核参数,将桥接的IPv4流量传递到iptables的链
创建/etc/sysctl.d/k8s.conf
文件
添加内容如下:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0
(2) 执行命令使修改生效
# 【候选】建议执行下面的命令
$ sudo modprobe br_netfilter
$ sudo sysctl -p /etc/sysctl.d/k8s.conf
注意: 切换到root用户
$ su
安装Kubernetes 目前安装版本 v1.13.1
$ apt update && apt-get install -y kubelet=1.13.1-00 kubernetes-cni=0.6.0-00 kubeadm=1.13.1-00 kubectl=1.13.1-00
设置为开机重启
$ sudo systemctl enable kubelet && systemctl start kubelet
$ sudo shutdown -r now
使用root用户登录Master
主机
执行如下个命令
kubectl get nodes
输出如下
$ kubectl get nodes
The connection to the server localhost:8080 was refused - did you specify the right host or port?
查看当前k8s版本
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.1", GitCommit:"eec55b9ba98609a46fee712359c7b5b365bdd920", GitTreeState:"clean", BuildDate:"2018-12-13T10:39:04Z", GoVersion:"go1.11.2", Compiler:"gc", Platform:"linux/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?
把每个节点的主机名字改成集群中的名字,ip地址可以选择动态获取,也可以写全部改成金泰的
1. 使用root用户登录
2. 打开配置文件`vim /etc/cloud/cloud.cfg`
3. 修改配置`preserve_hostname: true`
使用root用户登录
1. 打开hosts文件 `vim /etc/hosts`
2. 输入如下内容
```shell
192.168.80.144 master
192.168.80.145 node1
192.168.80.146 node2
3. 重启机器`shutdown -r now`
`$ mkdir /home/zxt/working
$ cd /home/zxt/working/
kubeadm
对应的配置文件,候选操作在home/zxt/working/
目录下使用kubeadm配置文件,通过在配置文件中指定docker仓库地址,便于内网快速部署。
生成配置文件
kubeadm config print init-defaults ClusterConfiguration > kubeadm.conf
kubeadm.conf
中的如下两项:vi kubeadm.conf
# 修改 imageRepository: k8s.gcr.io
# 改为 registry.cn-beijing.aliyuncs.com/imcto
imageRepository: registry.cn-beijing.aliyuncs.com/imcto
# 修改kubernetes版本kubernetesVersion: v1.13.0
# 改为kubernetesVersion: v1.13.1
kubernetesVersion: v1.13.1
现在上面的镜像仓库不能用了,下面是一个新的可用的仓库
registry.aliyuncs.com/google_containers
3. 修改kubeadm.conf
中的API服务器地址,后面会频繁使用这个地址。
localAPIEndpoint:
advertiseAddress: 192.168.80.144
bindPort: 6443
注意:
192.168.80.144
是master主机的ip地址
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
scheduler: {}
这里的10.244.0.0/16
和 10.96.0.0/12
分别是k8s内部pods和services的子网网络,最好使用这个地址,后续flannel网络需要用到。
$ kubeadm config images list --config kubeadm.conf
registry.cn-beijing.aliyuncs.com/imcto/kube-apiserver:v1.13.1
registry.cn-beijing.aliyuncs.com/imcto/kube-controller-manager:v1.13.1
registry.cn-beijing.aliyuncs.com/imcto/kube-scheduler:v1.13.1
registry.cn-beijing.aliyuncs.com/imcto/kube-proxy:v1.13.1
registry.cn-beijing.aliyuncs.com/imcto/pause:3.1
registry.cn-beijing.aliyuncs.com/imcto/etcd:3.2.24
registry.cn-beijing.aliyuncs.com/imcto/coredns:1.2.6
#下载全部当前版本的k8s所关联的镜像
kubeadm config images pull --config ./kubeadm.conf
#初始化并且启动
$ sudo kubeadm init --config ./kubeadm.conf
更多kubeadm配置文件参数详见
kubeadm config print-defaults
k8s启动成功输出内容较多,但是记住末尾的内容
Your Kubernetes master has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of machines by running the following on each node
as root:
kubeadm join 192.168.80.144:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:e778d3665e52f5a680a87b00c6d54df726c2eda601c0db3bfa4bb198af2262a8
按照官方提示,执行以下操作。
执行如下命令
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
创建系统服务并启动
# 启动kubelet 设置为开机自启动
$ sudo systemctl enable kubelet
# 启动k8s服务程序
$ sudo systemctl start kubelet
NotReady
,证明初始化服务器成功$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 12m v1.13.1
$ kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health": "true"}
目前只有一个master,还没有node,而且是NotReady状态,那么我们需要将node加入到master管理的集群中来。在加入之前,我们需要先配置k8s集群的内部通信网络,这里采用的是flannel网络。
$cd /home/zxt/working
$wget https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
编辑这个文件,确保flannel网络是对的,找到net-conf.json
标记的内容是否正确。
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
这个"10.244.0.0/16"和 ./kubeadm.conf中的podsubnet的地址要一致。
应用当前flannel配置文件
itcast@master:~/working$ kubectl apply -f kube-flannel.yml
输出结果如下
root@master:~/working# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.extensions/kube-flannel-ds-amd64 created
daemonset.extensions/kube-flannel-ds-arm64 created
daemonset.extensions/kube-flannel-ds-arm created
daemonset.extensions/kube-flannel-ds-ppc64le created
daemonset.extensions/kube-flannel-ds-s390x created
确认关闭swap
apt install -y selinux-utils
swapoff -a
禁止selinux
setenforce 0
确认关闭防火墙
ufw disable
启动k8s后台服务
# 启动kubelet 设置为开机自启动
$ sudo systemctl enable kubelet
# 启动k8s服务程序
$ sudo systemctl start kubelet
将master机器的/etc/kubernetes/admin.conf
传到到node1和node2
登录master
终端
#将admin.conf传递给node1
sudo scp /etc/kubernetes/admin.conf [email protected]:/home/zxt/
#将admin.conf传递给node2
sudo scp /etc/kubernetes/admin.conf [email protected]:/home/zxt/
登录node1
终端,创建基础kube配置文件环境
$ mkdir -p $HOME/.kube
$ sudo cp -i $HOME/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
node2
终端,创建基础kube配置文件环境$ mkdir -p $HOME/.kube
$ sudo cp -i $HOME/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
node1
和node2
分别连接master
加入master集群。这里用的是kubeadm join
指令$ sudo kubeadm join 192.168.236.177:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:e778d3665e52f5a680a87b00c6d54df726c2eda601c0db3bfa4bb198af2262a8
这里要注意,使用的hash应该是master
主机 kubeadm init
成功之后生成的hash码。
将master
中的kube-flannel.yml
分别传递给两个node
节点.
#将kube-flannel.yml传递给node1
sudo scp $HOME/working/kube-flannel.yml [email protected]:/home/zxt/
#将kube-flannel.yml传递给node2
sudo scp $HOME/working/kube-flannel.yml [email protected]:/home/zxt/
分别启动flannel
网络
zxt@node1:~$ kubectl apply -f kube-flannel.yml
zxt@node2:~$ kubectl apply -f kube-flannel.yml
zxt@node2:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 35m v1.13.1
node1 Ready <none> 2m23s v1.13.1
node2 Ready <none> 40s v1.13.1
这样k8s就搭建起来了。