SilenceHVK / blog

:books: :octocat: Github static blog post, experience the fun of using Issues.Welcome star( 静态博客文章,体验一下使用 Issues 的乐趣,欢迎 star )个人博客地址:blog.hvkcoder.me/love
https://github.com/SilenceHVK/Articles/issues
MIT License
231 stars 9 forks source link

【Kubernetes】01. 初识 Service Mesh 与 K8S #73

Open SilenceHVK opened 3 years ago

SilenceHVK commented 3 years ago

一、 服务网格(Service Mesh)

原文:Pattern: Service Mesh

服务网格(Service Mesh)最早是由开发 Linkerd 的 Buoyant 公司提出,并在内部使用。2016年9月29日第一次公开使用该术语。2017 年随着 Linkerd 的传入,Service Mesh 进入国内技术区。

1.1 目前微服务架构的痛点

1.2 什么是 Service Mesh

服务网格是一个基础设施层 ,功能在于处理服务间通信,职责是负责实现请求的可靠传递。在实践中,服务网格通常实现为轻量级网络代理,通常与应用程序部署在一起,但是对应用透明。

在一个服务网格中,服务间的通信完全由 Sidecar(边车)代理完成,相互连接的 Sidecar 形成网状结构。

Service Mesh

服务网格由 数据平面(Data Plane) 和 控制平面(Control Plane)组成。数据平面负责部署 Sidecar 的请求代理,控制平面主要负责请求代理之间的交互,以及用户与请求代理的交互。

二、Kubernetes

Kubernetes 是 Google 2014 年创建管理的,是 Google 10 多年大规模容器管理技术 Borg 的开源版本。是容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。其目标是促进完善组件和工具的生态系统,以减轻应用程序在公有云或私有云中运行的负担。

Kubernetes

2.1 Kubernetes 集群部署

系统配置

hostnamectl set-hostname k8s-master

# 将 k8s-master 和对应的 IP 地址 添加到 /etc/hosts
# 备份 yum 源配置
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

# 从 163 网站中下载系统对应的 yum 源配置,放置到 /etc/yum.repos.d/ 文件中
http://mirrors.163.com/.help/centos.html

# 运行命令生成缓存
yum clean all && yum makecache

# 安装依赖包
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
# 关闭防火墙,并关闭其开机自启
systemctl stop firewalld && systemctl disable firewalld

# 安装 iptables-services
yum -y install iptables-services

# 设置 iptables 为开机自启
systemctl start iptables && systemctl enable iptables

# 清空 iptables 的规则,保存
iptables -F && service iptables save
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
swapoff -a

# 注释 /etc/fstab 对象的条目,防止开机自动挂载 swap 分区
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# 可以通过 free 命令验证
cat > /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv6.conf.all.disable_ipv6=1
EOF

# 加载 br_netfilter 模块
modprobe br_netfilter

# 手动刷新
sysctl -p /etc/sysctl.d/kubernetes.conf
## 同步 ntp服务器时间
ntpdate -u ntp1.aliyun.com

# 设置定时任务同步时间
echo "*/20 * * * * /usr/sbin/ntpdate -u ntp.api.bz >/dev/null 2>&1" >> /var/spool/cron/root
systemctl stop postfix && systemctl disable postfix
# 持久化保存日志的目录
mkdir /var/log/journal 
mkdir /etc/systemd/journald.conf.d

cat > /etc/systemd/journald.conf.d/99-prophet.conf << EOF
[Jouranl]
# 持久化保存到磁盘
Storage=persistent

# 压缩历史日志
Compress=yes

# 向磁盘刷写日志的时间间隔,默认五分钟
SyncIntervalSec=5m

# 限制日志的生成速率
RateLimitIntervalSec=30s
RateLimitBurst=10000

# 最大占用空间
SystemMaxUse=10G

# 单日志文件最大体积
SystemMaxFileSize=200M

# 日志保存时间
MaxRetentionSec=2week

# 不将日志转发到 syslog
ForwardToSyslog=no
EOF

systemctl restart systemd-journald
# 下载内核源
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

# 安装最新的内核版本
yum --enablerepo=elrepo-kernel install -y kernel-lt

# 设置开机从新内核启动
grub2-set-default "CentOS Linux (4.4.221-1.el7.elrepo.x86_64) 7 (Core)"

# 重启系统使其生效
reboot

# 通过 uname -r 验证

Docker 安装

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum update -y && sudo yum install -y \
  containerd.io-1.2.13 \
  docker-ce-19.03.11 \
  docker-ce-cli-19.03.11
mkdir -p /etc/docker

cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "registry-mirrors":["https://registry.docker-cn.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF
sudo mkdir -p /etc/systemd/system/docker.service.d
systemctl daemon-reload
systemctl start docker 
systemctl enable docker

使用 Kubeadm 部署 Kubernetes 集群

# 加载 br_netfilter 模块
modprobe br_netfilter

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

# 设置脚本权限 并执行
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules

# 通过 lsmod 查看是否被引导
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable --now kubelet

# 更改 kubelet 参数
sed -i 's/_ARGS=.*/&--cgroup-driver=systemd/g' /etc/sysconfig/kubelet

# 重新启动 kubelet
systemctl daemon-reload&&systemctl restart kubelet
kubeadm config print init-defaults > kubeadm-config.yml

apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  # 修改为主节点 IP 
  advertiseAddress: 192.168.249.160
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: master-160
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
# 修改为阿里原镜像
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
networking:
  dnsDomain: cluster.local
  # 配置成 Calico 的默认网段,如果使用 Flannel,则配置为 Flannel 的默认网段
  podSubnet: 192.168.0.0/16
  serviceSubnet: 10.96.0.0/12
scheduler: {}
---
# 开启 IPVS 模式
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
  SupportIPVSProxyMode: true
mode: ipvs

# 拉取镜像
kubeadm config images pull --config kubeadm-config.yml

# 指定 kubeadm 初始化配置
kubeadm init --config=kubeadm-config.yml --upload-certs | tee kubeadm-init.log

# init 如果出现 /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables

# 在 1.20.x kube-proxy 启动失败,需要删除 configMap 中配置
featureGates:
  SupportIPVSProxyMode: true

# 创建 Token 
kubeadm token create --print-join-command
# 安装 calico-operator 和 自定义资源配置
kubectl create -f https://kuboard.cn/install-script/v1.20.x/calico-operator.yaml
kubectl create -f https://kuboard.cn/install-script/v1.20.x/calico-custom-resources.yaml

# 允许 在master 节点部署应用
# kubectl taint nodes --all node-role.kubernetes.io/master-

# 不允许 在 master 节点部署应用
kubectl patch node master节点名称 -p '{"spec":{"unschedulable":true}}'

# 监听所有 pod 为 Running 状态
watch kubectl get pod -n kube-system -o wide

# 验证,当 nodes 状态为 Ready 时则表示网络插件安装成功
kubectl get nodes -o wide