kubernetes部署
常见安装方式
minikube
kubernetes社区维护的一个单机版集群,支持多平台,使用官方最新stable版本,支持绝大多数功能,适合于入门学习或开发测试环境使用。
文档地址:https://minikube.sigs.k8s.io/docs/
软件源
借助包管理工具安装,简单速度快但版本不是最新。
二进制
通过官方源码及文件安装,适合探究原理,安装过程较复杂。
kubeadm
官方较推荐的集群搭建方式,适用于非生产的其它环境。
文档地址:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/
ansible
可根据业务需求全面通过自动化的方式进行,准备工作复杂但一劳永逸,各节点完全可控,适用于生产环境部署。
参考文档:
部署前准备
禁用swap
未禁用安装时会报错
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
# 注释掉所有swap挂载
# 内核禁用swap
cat >> /etc/sysctl.d/k8s.conf << EOF
vm.swappiness = 0
EOF
sysctl -p /etc/sysctl.d/k8s.conf
网络参数调整
#配置网桥流量经过iptables
cat >> /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
#启用配置
modprobe br_netfilter
modprobe overlay
sysctl -p /etc/sysctl.d/k8s.conf
主机免密认证
# 生成密钥对
ssh-keygen -t rsa
# 批量发送公钥到目标IP
for i in `cat ip.txt`
do
expect -c "
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$i
expect {
\"*yes/no*\" {send \"yes\r\"; exp_continue}
\"*password*\" {send \"密码\r\"; exp_continue}
\"*Password*\" {send \"密码\r\";}
} "
done
docker 安装
#!/bin/bash
# docker 安装
# 安装依赖环境
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release -y
# 配置软件源
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io -y
配置加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://859q5usk.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
修改docker服务启动文件
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --exec-opt native.cgroupdriver=systemd -H fd:// --containerd=/run/containerd/containerd.sock
systemctl daemon-reload
systemctl restart docker
否则k8s启动过程会报错
master组件
- api-server 用户入口,提供RESTFUL风格的api接口。
- controller-manager 集群内部所有节点的资源对象的自动化管理控制中心,管理以下控制节点:
- 节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应
- 任务控制器(Job controller): 监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成
- 端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)
- 服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌
- scheduler 控制平面组件,负责监视新创建的、未指定运行节点(node)的 Pods,选择节点让 Pod 在上面运行。
- etcd 兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。
node组件
- flannel 网络组件,为所有节点规划IP,使不同节点的容器处于一个内网且IP不重复。
- coredns 为集群内的pod提供dns服务
- kube-proxy 提供两种功能:
- 管理service并提供service通信和负载均衡功能
- 使用etcd的watch功能,实现服务发现
- kubelet 相当于集群agent,负责与master通信和工作节点间的状态同步
- fluentd 集群中的一种日志解决方案
- dashboard web控制界面
- Ingress controller 应用级别的负载均衡解决方案
harbor部署
harbor独立于k8s集群作为镜像仓库。
# 安装docker compose
apt-get install docker-compose -y
# 上传镜像,获取地址:https://github.com/goharbor/harbor/releases
# 解压并加载镜像
tar xf harbor-offline-installer-v2.3.2.tgz -C /usr/local/
cd /usr/local/harbor
docker load < harbor.v2.3.2.tar.gz
# 复制配置文件
cp harbor.yml.tmpl harbor.yml
# 修改配置,不启用https需要注释掉,并更改hostname等信息后开始部署
./prepare
./install.sh
# 验证安装
docker-compose ps
安装完成后创建工作账号、仓库
配置harbor启动服务文件
vim /lib/systemd/system/harbor.service
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
[Service]
ExecStart=/usr/bin/docker-compose -f /usr/local/harbor/docker-compose.yml up
ExecStop=/usr/bin/docker-compose -f /usr/local/harbor/docker-compose.yml down
Restart=on-failure
RestartSec=5
Type=simple
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable harbor
登录到仓库
# 修改daemon.json,添加节点
{
"registry-mirrors": ["https://859q5usk.mirror.aliyuncs.com"],
"insecure-registries": ["10.0.0.19:80"]
}
docker login 10.0.0.19:80
# 输入创建的工作账号和密码
kubeadm方式安装kubernetes集群
master节点安装
阿里云源,配置文档:https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.36831b11qdMfgx
apt-get update && apt-get install -y apt-transport-https
curl 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-get update
apt-get install -y kubelet kubeadm kubectl
- kubelet 主要用来收集节点主机信息,以服务方式启动
- kubeadm 对集群进行管理,所以安装在master节点
- kubectl 对集群中的资源对象进行管控,一般情况下node节点不需要
在master节点使用命令初始化,默认镜像节点国内访问不到,需要替换成阿里云或提前下载
kubeadm init --kubernetes-version=1.22.1 \
--apiserver-advertise-address=10.0.0.12 \
--image-repository 10.0.0.19:80/google_containers \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
# 多主集群增加以下配置,VIP为keepalived提供的虚IP,haproxy配置中的集群节点
--control-plane-endpoint=VIP
--apiserver-bind-port=6443
# 生产环境部署强调标准化,建议使用配置文件部署
kubeadm init --config=config.yaml
# 初始化完成后按提示进行如下配置
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# master集群添加节点
kubeadm join 10.0.0.200:6443 --token ju5tmk.v5i1pksu4maa36kr \
--discovery-token-ca-cert-hash sha256:cbebae539732a14d9d97dc1ece1747a657015171e2029007e9991a38e000ca87 \
--control-plane \
--certificate-key ce6140802c44b9937048982f65deff6617d2fc5b8d651367f35888cb2964fb4e
# 获取key
kubeadm init phase upload-certs --upload-certs
# kubectl get cs查看状态scheduler不健康,修改配置文件
vim /etc/kubernetes/manifests/kube-scheduler.yaml
注释掉 - --port=0
# 安装网络插件
# kubeadm config print init-defaults 可以查看默认配置
初始化过程大概有以下几部分:
- 生成kubelet配置文件 /var/lib/kubelet/config.yaml
- 生成各类证书
- 生成kubeconfig文件
- 生成token,用于后续节点加入集群
kubelet配置cgroup
DOCKER_CGROUPS=$(docker info | grep 'Cgroup Driver' | cut -d ' ' -f4)
echo $DOCKER_CGROUPS
systemctl enable kubelet
设置服务自动启动,但先不启动服务,否则在初始化完成前会持续收到报错。
增加kubectl命令自动补全
echo "source <(kubectl completion bash)" >> ~/.bashrc
node节点部署
docker环境同master节点,添加好docker镜像加速及harbor
node节点只需要安装kubeadm和kubelet
加入集群
kubeadm join 10.0.0.12:6443 --token xtilvf.pvpjlmz7p8bzrr8u \
--discovery-token-ca-cert-hash sha256:41119458cea70f5ba699d77ab832c973c0aa56e34965ab57fcedd7e4d4f9a6f9
查看节点状态notready,查看日志
journalctl -u kubelet | tail -n 300

浙公网安备 33010602011771号