Open SilenceHVK opened 3 years ago
原文:Pattern: Service Mesh
服务网格(Service Mesh)最早是由开发 Linkerd 的 Buoyant 公司提出,并在内部使用。2016年9月29日第一次公开使用该术语。2017 年随着 Linkerd 的传入,Service Mesh 进入国内技术区。
服务网格是一个基础设施层 ,功能在于处理服务间通信,职责是负责实现请求的可靠传递。在实践中,服务网格通常实现为轻量级网络代理,通常与应用程序部署在一起,但是对应用透明。
在一个服务网格中,服务间的通信完全由 Sidecar(边车)代理完成,相互连接的 Sidecar 形成网状结构。
服务网格由 数据平面(Data Plane) 和 控制平面(Control Plane)组成。数据平面负责部署 Sidecar 的请求代理,控制平面主要负责请求代理之间的交互,以及用户与请求代理的交互。
Kubernetes 是 Google 2014 年创建管理的,是 Google 10 多年大规模容器管理技术 Borg 的开源版本。是容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。其目标是促进完善组件和工具的生态系统,以减轻应用程序在公有云或私有云中运行的负担。
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
Permission denied
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
--fail-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
# 持久化保存日志的目录 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 验证
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
# 加载 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
kubeadm
kubelet
kubectl
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
一、 服务网格(Service Mesh)
原文:Pattern: Service Mesh
服务网格(Service Mesh)最早是由开发 Linkerd 的 Buoyant 公司提出,并在内部使用。2016年9月29日第一次公开使用该术语。2017 年随着 Linkerd 的传入,Service Mesh 进入国内技术区。
1.1 目前微服务架构的痛点
1.2 什么是 Service Mesh
服务网格是一个基础设施层 ,功能在于处理服务间通信,职责是负责实现请求的可靠传递。在实践中,服务网格通常实现为轻量级网络代理,通常与应用程序部署在一起,但是对应用透明。
在一个服务网格中,服务间的通信完全由 Sidecar(边车)代理完成,相互连接的 Sidecar 形成网状结构。
服务网格由 数据平面(Data Plane) 和 控制平面(Control Plane)组成。数据平面负责部署 Sidecar 的请求代理,控制平面主要负责请求代理之间的交互,以及用户与请求代理的交互。
二、Kubernetes
Kubernetes 是 Google 2014 年创建管理的,是 Google 10 多年大规模容器管理技术 Borg 的开源版本。是容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。其目标是促进完善组件和工具的生态系统,以减轻应用程序在公有云或私有云中运行的负担。
2.1 Kubernetes 集群部署
系统配置
Permission denied
--fail-swap-on
来忽略 swap on)Docker 安装
使用 Kubeadm 部署 Kubernetes 集群
kubeadm
、kubelet
、kubectl