简介
docker容器化封装缺点
- 单机使用,集群困难
- 容器数量上升,管理成本加大
- 没有有效的容灾,自愈机制
- 没有统一的配置管理中心工具
- 没有容器周期性管理工具
- 没有预设编排模板,无法快速实现,大规模容器调度
- 没有图形化运维工具
- ….
Kubernetes(k8s) 是一套容器编排工具。Kubernetes 项目的本质,是为用户提供一个具有普遍意义的容器编排工具。
一个用于容器集群的自动化部署,扩展,以及管理容器应用,提供了资源调度,部署管理,服务发现,扩容缩容,监控等一整套功能。
k8s主要功能
数据卷 : pod 中容器共享数据
应用程序健康检查 : 容器内服务可能进程堵塞无法处理请求,可以设置监控检查策略保证应用健壮性
复制应用程序实例 : 控制器维护着 pod 副本数量,保证一个 pod 或一组同类的 pod 数量始终可用
弹性伸缩 : 根据设定的指标(cpu利用率)自动伸缩副本数量
服务发现 : 使用环境变量或 DNS 服务插件保证容器中程序发现 Pod 入口访问地址
负载均衡 : 一组 pod 副本分配 一个私有的集群 IP 地址,负载均衡转发请求到后端容器,在集群内部其他 pod 可通过这个 clusterIP 访问应用
滚动更新 :更新服务不中断,一次更新一个 pod ,而不是同时删除整个服务
服务编排 :通过文件描述部署服务,使得应用程序部署变得高效
资源监控 :Node节点组件集成 cAdvisor 资源收集工具,可通过 Heapster 汇总整个集群节点资源数据,然后存储到 InfluxDB 时序数据库,再由 Grafana 展示
提供认证和授权 : 支持角色访问控制(RBAC)认证授权等策略
基本对象
访问这个 pod 集合的策略 : 代理 Pod 集合对外表现是一个访问入口,分配一个集群
安装步骤
- 修改
root密码 - 修改主机名
- 配置静态
ip - 修改
hosts - 安装
docker - 禁止防火墙
- 关闭
swap - 禁止
selinux k8s系统网络配置- 安装
k8s - 验证
k8s
centsos7 安装最新版 k8s 流程示例
kubeadm 高可用安装 请参考 k8s安装-三主两工作节点高可用-kubeadm
部分安装工具
https://github.com/easzlab/kubeasz ansible
https://github.com/kubernetes/kubeadm 官方
准备工作
三台刚安装系统的 centos7 主机(一般主流 linux 发行版即可),国内环境先准备换源
1 | 192.168.43.101 k8s01 |
以下操作在所有主机进行 (虚拟机可以在一台主机操作完后 clone)
- yum 换阿里源 国内网络可能下载不了
k8s
1 | mv /etc/yum.repos.d/ /etc/yum.repos.d.backup/ |
配置主机名
1
2
3echo '192.168.43.101 k8s01
192.168.43.102 k8s02
192.168.43.103 k8s03' >> /etc/hosts关闭 swap, 注释 swap 分区,关闭 selinux ,关闭防火墙
kubernetes的想法是将实例紧密包装到尽可能接近100%。 所有的部署应该与CPU /内存限制固定在一起。 所以如果调度程序发送一个pod到一台机器,它不应该使用交换。也可添加kubelet参数 --fail-swap-on=false来解决。但经常会出问题且难以定位,所以不推荐开启swap
关闭 selinux 以允许容器访问宿主机的文件系统,和访问 pod 网络的需要
nftables 后端兼容性问题,产生重复的防火墙规则1
2
3
4
5
6
7
8swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
grep SELINUX= /etc/selinux/config | grep -v "#"
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
grep SELINUX= /etc/selinux/config | grep -v "#"
setenforce 0
systemctl stop firewalld
systemctl disable firewalld
- 配置内核参数,将桥接的 IPv4 流量传递到 iptables的链,并加载所有配置
1
2
3
4
5
6cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
开启其他内核参数(可自行配置)
1 | cat > /etc/sysctl.d/kubernetes.conf <<EOF |
安装常用包,调整时区, 配置文件限制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23yum install vim bash-completion net-tools gcc -y
## 设置系统时区为中国/上海
timedatectl set-timezone Asia/Shanghai
## 将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
## 重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond
cat >>/etc/security/limits.conf<<EOF
* soft nofile 655360
* hard nofile 131072
* soft nproc 655350
* hard nproc 655350
* seft memlock unlimited
* hard memlock unlimitedd
EOFkube-proxy开启ipvs的前置条件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39# 1、加载netfilter模块
modprobe br_netfilter
# 2、添加配置文件
cat >/etc/modules-load.d/ipvs.conf<<EOF
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_sh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF
systemctl enable --now systemd-modules-load.service
# systemctl restart systemd-modules-load.service
# 3、检查
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
## 有结果则安装正常使用阿里云安装 docker-ce , 并使用阿里云 作为镜像仓库,改为 systemd
1
2
3
4
5
6
7
8
9
10
11
12
13
14yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://1hdirfy9.mirror.aliyuncs.com"],
"exec-opts":["native.cgroupdriver=systemd"]
}
EOF
systemctl daemon-reload
systemctl enable docker
systemctl restart docker安装 kubectl、kubelet、kubeadm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17## 添加阿里kubernetes源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 安装
yum install kubectl kubelet kubeadm -y
systemctl enable kubelet
yum list --showduplicates kubeadm --disableexcludes=kubernetes # 查找kubeadm 版本
yum install -y kubeadm-1.20.0-0 --disableexcludes=kubernetes # 安装 kubeadm-1.20.0-0国内镜像拉取镜像,及修改配置
1
2
3
4
5# 初始化配置写入文件 一般修改 advertiseAddress:master的IP eg:advertiseAddress: 192.168.43.101, name: k8s01
# 修改 imageRepository: registry.aliyuncs.com/google_containers # 阿里云镜像
kubeadm config print init-defaults > kubeadm_init.yaml
kubeadm config images list --kubernetes-version v1.18.0 # 查看镜像版本
kubeadm config images pull --config kubeadm_init.yaml # 从配置文件拉取镜像
修改后的配置文件示例
1 | apiVersion: kubeadm.k8s.io/v1beta2 |
以下操作在各个主机进行
修改主机名
1
hostnamectl --static set-hostname k8s01
master
1
2
3
4
5
6
7
8
9
10kubeadm init --config kubeadm_init.yaml
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
yum install -y bash-completion
echo "source <(kubectl completion bash)" >> ~/.bashrc # 自动补全
[root@k8s01 ~]# curl -k --tlsv1 "https://192.168.43.101:6443/healthz" # Master 容器启动后,kubeadm 会通过检查 localhost:6443/healthz 这个 Master 组件的健康检查 URL,等待 Master 组件完全运行起来. 然后 kubeadm 就会为集群生成一个 bootstrap token
okslave
1
kubeadm join 192.168.43.100:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:9817c0962e497c7bde436c1be5e4e98acecaf862c46dd0e1ba3d81ee04860104
master 实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15kubectl create -f calico.yaml # 创建资源
kubectl delete -f calico.yaml # 删除资源
[root@k8s01 ~]# curl -k --tlsv1 https://192.168.43.101:6443/version
{
"major": "1",
"minor": "20",
"gitVersion": "v1.20.0",
"gitCommit": "af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38",
"gitTreeState": "clean",
"buildDate": "2020-12-08T17:51:19Z",
"goVersion": "go1.15.5",
"compiler": "gc",
"platform": "linux/amd64"
卸载
1 | kubeadm reset -f |
kubeadm 补
token 过期
加入 woker 节点1
2
3[root@k8s01 ~]# kubeadm token create --print-join-command
kubeadm join apiserver.cluster.local:6443 --token j1cf6b.fzf26rxmdxpyvyw3 --discovery-token-ca-cert-hash sha256:bf44a0498e5da5c767f468a157ceefac3f17810d18e7ff978c2953446c3d3ee3
加入 contorl 节点1
2
3
4
5
6
7
8
9[root@k8s01 ~]# kubeadm init phase upload-certs --upload-certs
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[upload-certs] Using certificate key:
c78726ecc6445372e4c00b1453f2743960eaa8ca3a9f97be8774ce40b028b59a
# 结合work
kubeadm join apiserver.cluster.local:6443 --token j1cf6b.fzf26rxmdxpyvyw3 --discovery-token-ca-cert-hash
sha256:bf44a0498e5da5c767f468a157ceefac3f17810d18e7ff978c2953446c3d3ee3 --control-plane --certificate-key c78726ecc6445372e4c00b1453f2743960eaa8ca3a9f97be8774ce40b028b59a
Master 组件的 YAML 文件会被生成在 /etc/kubernetes/manifests 路径下
1 | [root@k8s01 ~]# ll /etc/kubernetes/manifests |
Static Pod : 当这台机器上的 kubelet 启动时,它会自动检查这个目录,加载所有的 Pod YAML 文件,然后在这台机器上启动它们
生成的证书文件都放在 Master 节点的 /etc/kubernetes/pki 目录下
1 | [root@k8s01 ~]# tree /etc/kubernetes/pki |
在 token 生成之后,kubeadm 会将 ca.crt 等 Master 节点的重要信息,通过 ConfigMap 的方式保存在 Etcd 当中,供后续部署 Node 节点使用。这个 ConfigMap 的名字是 cluster-info.
1 | [root@k8s01 ~]# kubectl -n kube-public describe cm cluster-info |
在 kubernetes 集群中,Node 上组件 kubelet 和 kube-proxy 都需要与 kube-apiserver 进行通信,为了增加传输安全性,采用 https方式。这就涉及到 Node 组件需要具备 kube-apiserver 用的证书颁发机构(CA)签发客户端证书,当规模较大时,这种客户端证书颁发需要大量工作,同样也会增加集群扩展复杂度。为了简化流程,Kubernetes 引入了 TLS bootstraping机制来自动颁发客户端证书
kubeadm 至少需要发起一次“不安全模式”的访问到 kube-apiserver,从而拿到保存在 ConfigMap 中的 cluster-info(它保存了 APIServer 的授权信息)。而 bootstrap token,扮演的就是这个过程中的安全验证的角色。
只要有了 cluster-info 里的 kube-apiserver 的地址、端口、证书,其他节点 的 kubelet 就可以以“安全模式”连接到 apiserver 上,这样一个新的节点就部署完成了。
接下来,你只要在其他节点上重复这个指令就可以了 kubeadm join 192.168.43.100:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:9817c0962e497c7bde436c1be5e4e98acecaf862c46dd0e1ba3d81ee04860104
用户使用 kubectl 获取容器日志等 streaming 操作时,需要通过 kube-apiserver 向 kubelet 发起请求,这个连接也必须是安全的。kubeadm 为这一步生成的是 apiserver-kubelet-client.crt 文件,对应的私钥是 apiserver-kubelet-client.key。
node 节点:1
2
3[root@k8s03 ~]# tree /etc/kubernetes/pki
/etc/kubernetes/pki
└── ca.crt # 是 master 节点的 ca.crt
二进制安装
calico 示例
1 | --- |