Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
SilenceHVK opened this issue Apr 7, 2021 · 0 comments
Open

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

SilenceHVK opened this issue Apr 7, 2021 · 0 comments

Comments

@SilenceHVK
Copy link
Owner

一、 服务网格(Service Mesh)

原文:Pattern: Service Mesh

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

1.1 目前微服务架构的痛点

  • 侵入性强:为了集成组件SDK,不光需要引入依赖,有些组件还必须添加如注解、配置等代码,业务代码与治理层代码界限不清晰;
  • 学习成本高:Spring Cloud 组件繁多,需要一个个的熟悉;
  • 版本碎片严重:由于组件繁多,导致服务治理组件的版本不统一,从而导致不同版本之间的服务治理组件不兼容;
  • 受技术栈约束:以 Spring Cloud 为例,清一色的提供 Java 技术栈支持,导致其他语言要么借助开源组织开发,要么公司单独针对开发;

1.2 什么是 Service Mesh

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

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

Service Mesh

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

二、Kubernetes

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

Kubernetes

2.1 Kubernetes 集群部署

系统配置

  • 设置系统主机名以及添加 Host 文件映射
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
  • 设置防火墙为 Iptables
# 关闭防火墙,并关闭其开机自启
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
  • 关闭 SELinux,否则后续 K8S 挂载目录时可能会报错 Permission denied
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
  • 关闭 swap 分区,否则 kubelet 会启动失败(可以通过参数 --fail-swap-on 来忽略 swap on)
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
  • 设置日志保存方式,设置默认为 journald
# 持久化保存日志的目录
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
  • CentOS7.x系统自带的3.10.x内核存在一些Bugs,导致运行的Docker、kubernetes不稳定,建议升级内核,容器使用的坑会少很多
# 下载内核源
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
  • 更新 yum 缓存 并安装 docker-ce
sudo yum update -y && sudo yum install -y \
  containerd.io-1.2.13 \
  docker-ce-19.03.11 \
  docker-ce-cli-19.03.11
  • 设置 daemon.json
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
  • 启动 docker
systemctl daemon-reload
systemctl start docker 
systemctl enable docker

使用 Kubeadm 部署 Kubernetes 集群

  • kube-proxy 开启 ipvs
# 加载 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
  • 配置软件安装源,并安装 kubeadmkubeletkubectl
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,只需在主节点部署
# 安装 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant