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
posted @ 2022-03-19 16:46  Atlas-777  阅读(176)  评论(0)    收藏  举报