操作系统 | 内核 |
---|---|
centos 7.2 | 3.10.0.327 |
当做主节点的服务器要能免密访问从节点的服务器
升级内核
yum update kernel 并重启
部署的服务器不能联网,搭建一个代理服务器来上网(挑了个麻烦的编译安装,yum也可以直接安装,好处是自己随意删除)
安装编译前的依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
下载nginx源码
http://nginx.org/en/download.html
因为会用到https协议,nginx编译时需要打下补丁,参考:
https://blog.csdn.net/qq_42890862/article/details/129617736
./configure --prefix=install_dir --with-http_ssl_module
make -j9
make install
安装路径install_dir就填自己的账户下的自定义的路径即可,不用安装到系统路径下
有正向代理后,这步其实不用就行。
就记录下当时的一些配置。
下面是ngingx里添加的一些反向代理的配置项,主要是让部署服务器能通过该服务器去访问阿里云的yum源,从而能安装k8s和docker
location /centos/ {
proxy_pass http://mirrors.aliyun.com/centos/ ;
}
location /epel/ {
proxy_pass http://mirrors.aliyun.com/epel/ ;
}
location /docker-ce/ {
proxy_pass http://mirrors.aliyun.com/docker-ce/ ;
}
location /kubernetes/ {
proxy_pass http://mirrors.aliyun.com/kubernetes/ ;
}
配置正向代理其实就够了。
下面是正向代理的配置,其中第一个43876端口是代理http请求,43879是代理的https请求。
server {
resolver 8.8.8.8;
listen 43876;
location / {
proxy_pass http://$http_host$request_uri;
proxy_set_header HOST $http_host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0k;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_next_upstream error timeout invalid_header http_502;
}
}
server {
listen 43879;
resolver 223.5.5.5;
proxy_connect;
proxy_connect_allow 443 563;
proxy_connect_connect_timeout 10s;
proxy_connect_read_timeout 10s;
proxy_connect_send_timeout 10s;
location / {
proxy_pass http://$host;
proxy_set_header Host $host;
}
}
配置阿里云的yum源,参考https://developer.aliyun.com/article/653767
并且把mirrors.aliyun.com替换成刚才的代理服务器的ip加端口43876。
更详细的可以参考:https://www.runoob.com/docker/centos-docker-install.html
添加docker源镜像
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
查看docker版本
yum list docker-ce --showduplicates | sort -r
开始安装
yum install docker-ce-18.06.1.ce-3.el7
有个坑:
linux内核比较旧,安装版本不能太高,不然docker不能正常启动,经过测试下面版本是可以运行的18.06.1.ce-3.el7,也可以在查看docker版本时看到有多种版本
启动
systemctl start docker
docker info
docker info显示正常,表示docker安装完成
配置一下docker的代理
/etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://ip:43876/"
Environment="HTTPS_PROXY=http://ip:43879/"
Environment="NO_PROXY=localhost,127.0.0.1,.daocloud.io"
再重启下docker
systemctl daemon-reload
systemctl restart docker
测试下docker的速度
docker run hello-world
主要参考两篇博客:
下面是步骤:
关闭selinux
# 所有节点关闭 SELinux
setenforce 0
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
关闭交换区
swapoff -a
所有节点确保防火墙关闭
systemctl stop firewalld
systemctl disable firewalld
还需要设置docker的cgroupdriver使用systemd管理,跟k8s保持一致。
打包成一个shell脚本prepare.sh
,各个节点运行
swapoff -a
setenforce 0
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
systemctl stop firewalld
systemctl disable firewalld
cat <<EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://ud6340vz.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
# 添加 k8s 安装源
cat <<EOF > kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://代理ip/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://代理ip/kubernetes/yum/doc/yum-key.gpg https://代理ip/kubernetes/yum/doc/rpm-package-key.gpg
EOF
mv kubernetes.repo /etc/yum.repos.d/
执行安装
yum install -y --nogpgcheck kubelet-1.23.12 kubeadm-1.23.12 kubectl-1.23.12
启动,并且配置开机启动
systemctl enable kubelet
systemctl start kubelet
开始搭建k8s集群
# 只在 master 节点执行
export MASTER_IP=部署主ip
# 替换 k8s.master 为 您想要的 dnsName
export APISERVER_NAME=k8s.master
# Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中
export POD_SUBNET=172.18.0.1/16
# 下面这步要在所有的节点执行
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
创建一个配置文件kubeadm-config.yaml为:
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.23.12
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
controlPlaneEndpoint: "k8s.master:6443"
networking:
serviceSubnet: "10.96.0.0/16"
podSubnet: "172.18.0.1/16"
dnsDomain: "cluster.local"
开始初始化集群
kubeadm init --config=kubeadm-config.yaml --upload-certs
成功后,会输出join类似的命令行,这个从节点用来加入集群的,可以复制到一个地方保留下。
kubeadm join k8s.master:6443 --token xxxxx --discovery-token-ca-cert-hash sha256:xxxx
如果忘记了,可以通过下面命令重新获取
kubeadm token create --print-join-command
接着在主节点执行下面的操作
# 复制授权文件,以便 kubectl 可以有权限访问集群
# 如果你其他节点需要访问集群,需要从主节点复制这个文件过去其他节点
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# 在其他机器上创建 ~/.kube/config 文件也能通过 kubectl 访问到集群
如果操作有问题,可以重新来,命令是
kubeadm reset
从节点可以开始加入集群,运行命令如下,其实是从kube ad:
kubeadm join k8s.master:6443 --token xxxxx --discovery-token-ca-cert-hash sha256:xxxx
如果有问题可以执行kubeadm reset
重新来
通过kubectl get node
可以看到当前集群的节点情况,此时应该都是NotReady状态,原因是网络没打通成功,需要安装网络插件才行。用的比较多的是flannel
先去下载flannel的yaml文件
路径是:
https://github.com/flannel-io/flannel/blob/v0.13.1-rc2/Documentation/kube-flannel.yml
因为阿里云的镜像库里只有0.13.1-rc2版本,所以就下这个版本,不然拉不下来镜像也没法运行
需要修改下配置,将下面这段的网络,改成跟上面的kubeadm-config.yaml里的podsubnet里一样
net-conf.json: |
{
"Network": "10.18.0.1/16",
"Backend": {
"Type": "vxlan"
}
}
执行插件安装
kubectl apply -f kube-flannel.yaml
到这里,其实还会出错。(原因是CNI Plugins中没有flannel)
可以看到所有的节点都不是ready状态
kubectl get node
可以通过下面的命令来看报错信息
journalctl -u kubelet -f
6月 17 21:53:24 hadoop002 kubelet[12440]: E0617 21:53:24.875491 12440 kubelet.go:2391] "Container runtime network not ready" networkReady="NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized"
6月 17 21:53:29 hadoop002 kubelet[12440]: I0617 21:53:29.012785 12440 cni.go:205] "Error validating CNI config list" configList="{\n \"name\": \"cbr0\",\n \"cniVersion\": \"0.3.1\",\n \"plugins\": [\n {\n \"type\": \"flannel\",\n \"delegate\": {\n \"hairpinMode\": true,\n \"isDefaultGateway\": true\n }\n },\n {\n \"type\": \"portmap\",\n \"capabilities\": {\n \"portMappings\": true\n }\n }\n ]\n}\n" err="[failed to find plugin \"flannel\" in path [/opt/cni/bin]]"
去下载下flannel插件,下载路径如下
https://github.com/containernetworking/plugins/releases/tag/v0.8.6
解压
tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz
将解压后的flannel插件上传到各个节点的/opt/cni/bin/
执行kubectl get node
就可以看到都正常了
[root@hadoop002 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
hadoop002 Ready control-plane,master 16h v1.23.12
hadoop003 Ready <none> 16h v1.23.12
hadoop004 Ready <none> 16h v1.23.12
hadoop005 Ready <none> 16h v1.23.12