文章目录
一、Kubeadm安装方式
1、初始化服务器环境
# centos7查看内核版本,升级到4.18+
uname -a
# 如果低于4.18,建议升级一下内核
yum -y update
# 安装ELRepo源,输入以下命令:
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
# 安装最新的稳定内核。通过运行以下命令安装
yum --enablerepo=elrepo-kernel install kernel-ml -y
# 用以下命令重建grub2配置文件:
sudo grub2-set-default 0
grub2-mkconfig -o /boot/grub2/grub.cfg
# 重新启动计算机可用新内核:
reboot
# 修改所有服务器的/etc/hosts文件
vi /etc/hosts
192.168.0.1 k8s-master01
192.168.0.2 k8s-master02
192.168.0.3 k8s-node01
192.168.0.4 k8s-node02
# 修改服务器名称
#分别进入不同的服务器,修改 hostname 名称
hostnamectl set-hostname name
# 所有节点关闭防火墙、selinux、dnsmasq、swap
systemctl disable --now firewalld
systemctl disable --now dnsmasq
systemctl disable --now NetworkManager
setenforce 0
# 修改selinux文件
vi /etc/sysconfig/selinux
SELINUX=disabled
# 关闭swap
swapoff -a && sysctl -w vm.swappiness=0
# 修改fstab
vi /etc/fstab
# 注释掉一下配置
# /dev/mapper/cl-swap swap swap defaults 0 0
# 安装ntpdate同步时间
yum install -y ntpdate
# 修改时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' >/etc/timezone
# 同步阿里云时间服务器
ntpdate time2.aliyun.com
# 开机自启动上每5分钟同步一次时间
crontab -e
*/5 * * * * ntpdate time2.aliyun.com
# 所有节点配置limit
ulimit -SHn 65535
# 添加阿里云yum软件源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 所有节点安装ipvsadm及其他需要的工具
yum install ipvsadm ipset sysstat conntrack libseccomp -y
# 所有节点配置ipvs模块,在内核4.19版本nf_conntrack_ipv4已经改为nf_conntrack,本例安装的内核为4.18,使用nf_conntrack_ipv4即可
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
vi /etc/modules-load.d/ipvs.conf
# ipvs.conf内容开始
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
# ipvs.conf内容结束
# 执行systemctl enable --now systemd-modules-load.service
systemctl enable --now systemd-modules-load.service
# 检查是否加载
lsmod | grep -e ip_vs -e nf_conntrack
# 开启一些k8s集群中必须的内核参数,所有节点配置k8s内核
cat <<EOF > /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1
fs.may_detach_mounts=1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720
net.ipv4.tcp_keepalive_time=600
net.ipv4.tcp_keepalive_probes=3
net.ipv4.tcp_keepalive_intv1=15
net.ipv4.tcp_max_tw_buckets=36000
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_max_orphans=327680
net.ipv4.tcp_orphan_retries=3
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_max_syn_backlog=16384
net.ipv4.ip_conntrack_max=65536
net.ipv4.tcp_timestamps=0
net.core.somaxconn=16384
EOF
sysctl --system
2、Master01节点免密登录
Master01节点免密登录其他节点,安装过程中生成配置文件和证书均在Master01上操作,集群管理也在Master01上操作,阿里云或者AWS上需要单独一台Kubectl服务器。密钥配置如下:
# 生成密钥
ssh-keygen -t rsa
# 导入到所有服务器上
for i in k8s-master01 k8s-master02 k8s-node01;do ssh-copy-id -i ./ssh/id_rsa.pub $i;done
3、基本组件的安装
1、安装docker
# 所有机器都需要安装docker
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-18.06.1.ce-3.el7
# 设置docker下载源以及设置cgroupsdriver
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://g090nq5l.mirror.aliyuncs.com"],
"insecure-registries": ["k8s-node02"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
`注意:insecure-registries中的主机名称,要跟harbor的主机名称一致`
# 设置开机自启
systemctl enable docker && systemctl start docker
2、cri环境操作(之前都是kubelet直接操作容器,后面都是通过cri-docker来操作容器了)
# 下载软件
mkdir /data/softs/ && /data/softs
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.2/cri-dockerd-0.3.2.amd64.tgz
# 解压软件
tar xf cri-dockerd-0.3.2.amd64.tgz
mv cri-dockerd/cri-dockerd /usr/local/bin/
# 检查效果
cri-dockerd --version
# 将cri-dockerd放到所有节点上
> for i in 214 213
> do
> scp cri-dockerd/cri-dockerd root@172.17.183.$i:/usr/local/bin/
> done
# 定制配置文件
cat > /etc/systemd/system/cri-dockerd.service<<-EOF
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/goolgle_containers/pause:3.9 --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --cri-dockerd-root-directory=/var/lib/dockershim --docker-endpoint=unix:///var/run/docker.sock --cri-dockerd-root-directory=/var/lib/docker
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
# 定制配置
cat > /etc/systemd/system/cri-dockerd.socket <<-EOF
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=/var/run/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
EOF
# 设置开机自启动
systemctl daemon-reload
systemctl start cri-dockerd
# 检查是否有效
systemctl is-active cri-dockerd
3、harbor仓库操作
# 安装docker-compose
yum install -y docker-compose
# 获取软件
mkdir /data/{softs,server} -p && /data/softs
wget https://github.com/goharbor/harbor/releases/download/v2.5.0/harbor-offline-installer-v2.5.0.tgz
# 解压软件
tar -zxvf harbor-offline-installer-v2.5.0.tgz -C /data/server/
cd /data/server/harbor
# 加载镜像
docker load < harbor.v2.5.0.tar.gz
docker images
# 备份配置
cp harbor.yml.tmpl harbor.yml
# 修改配置
vim ./harbor.yml
hostname: k8s-node02 # 1、修改主机名称
# 2、将https都注释
harbor_admin_password: 123456 # 3、修改密码
data_volume: /data/server/harbor/data # 4、修改保存目录
# 执行./prepare,将harbor准备文件生成
./prepare
# 执行./install
./install.sh
# 接着就可以访问我们的hardor了
# 定制harbor服务启动文件
cat > /etc/systemd/system/harbor.service <<-EOF
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor
[Service]
Type=simple
Restart=on-failure
RestartSec=5
#需要注意的harbor的安装位置
ExecStart=/usr/bin/docker-compose --file /data/server/harbor/docker-compose.yml up
ExecStop=/usr/bin/docker-compose --file /data/server/harbor/docker-compose.yml down
[Install]
WantedBy=multi-user.target
EOF
# 重新加载服务配置文件
systemctl daemon-reload
systemctl enable harbor.service
# harbor仓库定制
`浏览器访问域名,用户名:admin,密码123456,创建sswang用户专用的项目仓库,名称为sswang,权限为公开的`
# 向harbor中推送镜像
# 1、登录
docker login <注册服务器地址>
# 2、推送
docker push xxxxx
2、kubeadm安装
# 所有节点安装kubeadm,kubelet和kubectl
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
systemctl enable kubelet # 设置开机启动
3、高可用组件安装(keepalive和HAProxy)
# 所有master节点通过yum安装HAProxy和KeepAlived:
yum install -y keepalived haproxy
# 所有Master节点配置HAProxy(详细配置参考HAProxy文档,所有Master节点的HAProxy配置相同)
mkdir /etc/haproxy
vim /etc/haproxy/haproxy.cfg
global # 全局参数设置
log 127.0.0.1 local0 err # log语法:log <address_1> [max_level_1] # 全局的日志配置,使用关键字,指定使用127.0.0.1上的syslog>服务中的local0日志设备,记录日志等级为info的日志
ulimit-n 16384
chroot /var/lib/haproxy # 改变当前工作目录
pidfile /var/run/haproxy.pid # 当前进程id文件
maxconn 2000 # 最大连接数
user haproxy # 所属用户
group haproxy # 所属用户组
daemon # 以守护进程方式运行haproxy
stats socket /var/lib/haproxy/stats # 指定了HAProxy实例的socket文件,可以在运行时想HAProxy发送各种命令来获取其内部的统计信息,只有具有root权限的用户才能够连接到该套接字文件
stats timeout 30s
defaults # 默认参数设置
mode http # 默认的模式{tcp|http|health},tcp是4层,http是7层,health只会返回OK,已经弃用了
log global # 应用全局的日志配置
option httplog # 启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求日志
option dontlognull # 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器或者监控系统为了探测该服务是否>存活可用时,需要定期的连接或者获取某一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;
option http-server-close # 每次请求完毕后主动关闭http通道
option forwardfor except 127.0.0.0/8 # 如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要在HAProxy上配置此选项,这样HAProxy会把>客户端的IP信息发送给服务器,在HTTP请求中添加"X-Forwarded-For"字段。启用X-Forwarded-For,在requests头部插入客户端IP发送给后端的Server,使后端server护球到客>户端的真实IP。
option redispatch # 当使用了cookie时,haproxy将会将请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久>性;而此时,如果后端的服务器宕掉了,但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请求强制定向到另外一个后端server上,以保证服务的正常。
retries 3 # 定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用
timeout http-request 10s # http请求超时时间
timeout queue 1m # 一个请求在队列里的超时时间
timeout connect 10s # 连接超时
timeout client 1m # 客户端超时
timeout server 1m # 服务器端超时
timeout http-keep-alive 10s # 设置http-keep-alive的超时时间
timeout check 10s # 检测超时时间
maxconn 1000 # 每个进程可用的最大连接数
frontend monitor-in
bind *:33305
mode http
option httplog
monitor-uri /monitor
listen stats
bind *:8006
mode http
stats enable
stats hide-version
stats uri /stats
stats refresh 30s
stats realm Haproxy\ Statistics
stats auth admin:admin
frontend k8s-master
bind 0.0.0.0:16443
bind 127.0.0.1:16443
mode tcp
option tcplog
tcp-request inspect-delay 5s
default_backend k8s-master
backend k8s-master
mode tcp
option tcplog
option tcp-check
balance roundrobin
default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
server k8s-master01 127.0.0.1:6443 check
所有节点配置keepalived
# 创建keepalived配置文件目录
mkdir /etc/keepalived
# 编辑keepalived配置文件
vim /etc/keepalived/keepalived.conf
# 配置全局变量
global_defs {
router_id LVS_DEVEL # keepalived标识
}
# 配置VRRP脚本
vrrp_script chk_apiserver {
script "/etc/keepalived/check_apiserver.sh" # 检测API服务器的脚本
interval 2 # 脚本间隔2秒执行
weight -5 # 具体权重值
fall 3 # 失败3次
rise 2 # 成功2次
}
# 配置VRRP实例
vrrp_instance VI_1 {
state MASTER # 状态为主节点,其中一台机器为MASTER。其他机器为BACKUP
interface ens33 # 指定网卡为ens33
unicast_src_ip 172.16.10.101 # 配置单播ip,当前网卡的ip
unicast_peer {
172.16.10.100 # 单播与其他节点通信
}
virtual_router_id 51 # 虚拟路由标识
priority 100 # 优先级
advert_int 2 # 广告间隔时间
authentication {
auth_type PASS # VRRP认证类型
auth_pass K8SHA_KA_AUTH # VRRP认证密码
}
virtual_ipaddress {
192.168.0.200/24 dev ens33
}
track_script {
chk_apiserver # 监控API服务器的脚本
}
}
为所有的master添加健康检查脚本
cat > /etc/keepalived/check_apiserver.sh<<EOF
#!/bin/sh
# HAPROXY down
A=`ps -C haproxy --no-header | wc -l`
if [ \$A -eq 0 ]
then
systmectl start haproxy
if [ ps -C haproxy --no-header | wc -l -eq 0 ]
then
killall -9 haproxy
echo "HAPROXY down" | mail -s "haproxy"
sleep 3600
fi
fi
EOF
# 赋予权限
chmod a+x /etc/keepalived/check_apiserver.sh
配置完成,现在启动haproxy和keepalived
systemctl enable --now haproxy
systemctl enable --now keepalived
# 查看haproxy状态
systemctl status haproxy
# 查看keepalived状态
systemctl status keepalived
# 查看k8s-master-01是否有vip
ip address show ens32
#然后停止k8s-master-01,查看k8s-master-02是否有vip
systemctl stop keepalived
4、kubeadm集群初始化
# 获取默认配置文件
cd /root/
kubeadm config print init-defaults > kubeadm-config.yaml
# 修改初始化配置文件
# 内容start
apiVersion: kubeadm.k8s.io/v1beta2 # kubeadm的API版本
bootstrapTokens: # 集群引导令牌配置
- groups: # 引导令牌组
- system:bootstrappers:kubeadm:default-node-token # 引导程序使用的组名
token: 7t2weq.bjbawausm0jaxury # 引导令牌值
ttl: 24h0m0s # 引导令牌的生命周期,24小时
usages: # 引导令牌的使用方式
- signing # 签名
- authentication # 鉴权
kind: InitConfiguration # 初始化配置类型
localAPIEndpoint: # 本地API服务器端点配置
advertiseAddress: 192.168.0.100 # 用于公告Kubernetes API服务器的地址
bindPort: 6443 # 绑定Kubernetes API服务器的端口
nodeRegistration: # 节点注册配置
criSocket: /var/run/dockershim.sock # 节点容器运行时的Socket地址
name: k8s-master01 # 节点名称
taints: # 添加节点的污点信息
- effect: NoSchedule # 污点作用:不调度Pod
key: node-role.kubernetes.io/master # 污点的键值,标识此节点是Master节点
---
apiServer: # API服务器配置
certSANs: # 证书的SAN列表
- 192.168.0.200 # 证书SAN的主机IP
timeoutForControlPlane: 4m0s # 控制面板组件的超时时间
apiVersion: kubeadm.k8s.io/v1beta2 # kubeadm的API版本
certificatesDir: /etc/kubernetes/pki # 存储Kubernetes证书的目录
clusterName: kubernetes # 集群名称
controlPlaneEndpoint: 192.168.0.200:16443 # 控制面板组件的API服务器端点
controllerManager: {} # 控制器管理器配置
dns: # DNS配置
type: CoreDNS # DNS类型
etcd: # etcd配置
local:
dataDir: /var/lib/etcd # 存储etcd数据的目录
imageRepository: daocloud.io/daocloud # 容器镜像仓库
kind: ClusterConfiguration # 集群配置类型
kubernetesVersion: v1.18.5 # Kubernetes版本
networking: # 网络配置
dnsDomain: cluster.local # DNS域名
podSubnet: 172.168.0.0/16 # Pod的IP地址段
serviceSubnet: 10.96.0.0/12 # Service的IP地址段
scheduler: {} # 调度器配置
# end
# 配置文件完成后,使用命令拉取镜像
kubeadm config images pull --config kubeadm-config.yaml
# 镜像拉取后,我们要初始化集群,初始化集群前,把上面的一些ip地址改为你master的ip
# 如果初始化失败,可以使用命令:kubeadm reset
kubeadm init --config ./kubeadm-config.yaml --upload-certs
# 初始化成功之后,会让我们执行一下命令,我们把输出的一下命令保存一下,因为我们以后加入节点都要用到
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 172.16.10.200:16443 --token 7t2weq.bjbawausm0jaxury \
--discovery-token-ca-cert-hash sha256:15364811e62517dadd6242776017270abf75277bc1d12abbe149a70dba862a19 \
--control-plane --certificate-key 819c586e55deeb156abbda3022e6f7f2717c2bb57b39d59d7871ea16e77acd7d
--node-name k8s-master02
# 添加工作节点
kubeadm join 172.16.10.200:16443 --token 7t2weq.bjbawausm0jaxury \
--discovery-token-ca-cert-hash sha256:15364811e62517dadd6242776017270abf75277bc1d12abbe149a70dba862a19
# k8s-master-xx添加master集群,先将证书导入到另一个master服务器中
ssh root@172.16.10.101 mkdir -p /etc/kubernetes/pki/etcd
scp /etc/kubernetes/admin.conf root@172.16.10.101:/etc/kubernetes
scp /etc/kubernetes/pki/{ca.*,sa.*,front-proxy-ca.*} root@172.16.10.101:/etc/kubernetes/pki
scp /etc/kubernetes/pki/etcd/ca.* root@172.16.10.101:/etc/kubernetes/pki/etcd
# 导入证书完毕,执行初始化集群时打印的加入master集群的命令
kubeadm join 172.16.10.100:16443 --token 7t2weq.bjbawausm0jaxury \
--discovery-token-ca-cert-hash sha256:f262cc0a9236e97b12063cc0c198a35fd5d3491be4cc147ee65c72a88640e2db \
--control-plane --certificate-key 58b32a83101e3040559f01c1c8f85568aa23157b9b00e1fe15c8ee0be518b9c3
# 执行之后,我们查看集群中的组件启动情况
kubectl get po -n kube-system
# 查看集群日志信息
tail -f /var/log/messages
5、安装Calico网络插件
# 安装3.15的Calico插件,你的k8s支持具体的版本可以去官网查看
wget https://docs.projectcalico.org/v3.15/manifests/calico.yaml --no-check-certificate
# 修改Calico配置文件
vim ./calico.yaml
#更改calico.yaml
# Cluster type to identify the deployment type
- name: CLUSTER_TYPE
value: "k8s,bgp"
# 下方新增
- name: IP_AUTODETECTION_METHOD
value: "interface=ens32"
# ens32为本地网卡名字
# no effect. This should fall within `--cluster-cidr`.
- name: CALICO_IPV4POOL_CIDR
#修改为与 kubeadm-config.yaml 中一致的pod地址池。
value: "10.244.0.0/16"
# Disable file logging so `kubectl logs` works.
# 保存配置文件,并启用我们的Calico插件
kubectl apply -f ./calico.yaml
# 再次查看k8s中集群的状态
kubectl get po -n kube-system
6、如果token过期后如何处理
# 通过上面的步骤,我们部署了一个K8s的一个Master,我们可以查看集群中的节点信息
kubectl get node
# 查看bootstrap-token的密钥
kubectl get secret -n kube-system
# 显示了我们的密钥名称,我们可以查看里面的内容
bootstrap-token-7t2weq bootstrap.kubernetes.io/token 6 19m
# 查看密钥内容
kubectl get secret -n kube-system bootstrap-token-7t2weq -oyaml
# 发现有一个过期时间,我们可以对其进行base64解密,查看过期时间为多久
echo "MjAyMy0wNC0xN1QwMDo0NTo0MSswODowMA==" | base64 --decode
# 删除token
kubectl delete secret -n kube-system bootstrap-token-7t2weq
# 创建一个新的token,并且生成加入Node节点的命令
kubectl token create --print-join-command
# 上面生成的token只能用来加入node节点,那么我们要加入master节点的话,还要生成一个参数
kubeadm init phase upload-certs --upload-certs
# 将生成的新的值保存一下,要加入master节点,比node节点多一个参数
kubeadm join 172.16.10.200:16443 --token 7t2weq.bjbawausm0jaxury \
--discovery-token-ca-cert-hash sha256:15364811e62517dadd6242776017270abf75277bc1d12abbe149a70dba862a19 \
--control-plane --certificate-key <刚刚生成的参数>
# 删除节点
kubectl delete node 节点
7、Node节点的配置
# 把主节点admin.conf证书复制到其他node节点
scp /etc/kubernetes/admin.conf root@172.16.10.102:/etc/kubernetes/
scp /etc/kubernetes/admin.conf root@172.16.10.103:/etc/kubernetes/
# #除了让master节点加入集群组成高可用外,node节点也要加入集群中。
kubeadm join 172.16.10.100:16443 --token 7t2weq.bjbawausm0jaxury \
--discovery-token-ca-cert-hash sha256:f262cc0a9236e97b12063cc0c198a35fd5d3491be4cc147ee65c72a88640e2db
8、安装Metrics
cd k8s-ha-install