Kubernetes学习文档(二)

kubernetes 入门

我来深入学习下 kubernetes 的集群架构及环境搭建以及运行一个简单 docker 容器。

2.1 K8S集群架构方案

kubernetes集群架构

Kubernetes 集群组件:

  • etcd 一个高可用的K/V键值对存储和服务发现系统
  • flannel 实现跨主机的容器网络的通信
  • kube-apiserver 提供kubernetes集群的API调用
  • kube-controller-manager 确保集群服务
  • kube-scheduler 调度容器,分配到Node
  • kubelet 在Node节点上按照配置文件中定义的容器规格启动容器
  • kube-proxy 提供网络代理服务

Kubernetes 集群部署方案

如下是集群部署策略,1个master + 2个node。存储集群etcd是单点集群(真实环境不推荐此做法,需要集群)。网络使用的是flannel虚拟二次网络。


K8s集群部署架构
Kubernetes具有完备的集群管理能力:
  1. 包括多层次的安全防护和准入机制
  2. 多租户应用支撑能力
  3. 透明的服务注册和服务发现机制
  4. 内建智能负载均衡器
  5. 强大的故障发现和自我修复能力
  6. 服务滚动升级和在线扩容能力
  7. 可扩展的资源自动调度机制
  8. 以及多粒度的资源管理能力

同时,kubernetes提供了完善的管理工具,这些工具涵盖了包括开发、部署测试、运维监控在内的各个环节。

在kubernetes中,service(服务)是分布式集群架构的核心,一个service对象拥有如下关键特征:
拥有一个唯一指定的名字(比如mysql-service)。
拥有一个虚拟IP(Cluster IP、service IP或VIP)和端口号。
能够提供某种远程服务能力。
被映射到了提供这种服务能力的一组容器应用上。

Kubernetes.io开发了一个交互式教程,通过WEB浏览器就能使用预先部署好的一个Kubernetes集群,快速体验kubernetes的功能和应用场景。

链接:https://kubernetes.io/docs/tutorials/kubernetes-basics/

K8s官方下载地址:https://github.com/kubernetes

环境准备
节点 ip地址 操作系统
master 192.168.1.10 CentOS 7.3-x86_64
node1 192.168.1.11 CentOS 7.3-x86_64
node2 192.168.1.12 CentOS 7.3-x86_64
集群详情
  • OS:CentOS Linux release 7.3.1611 (Core) 3.10.0-514.el7.x86_64
  • Kubernetes 1.6.0+(最低的版本要求是1.6)
  • Docker:建议使用 Docker CE
  • Etcd 3.3.10
  • Flannel 0.7.1 vxlan或者host-gw 网络
  • TLS 认证通信 (所有组件,如 etcd、kubernetes master 和 node)
  • RBAC 授权
  • kubelet TLS BootStrapping
  • kubedns、dashboard、heapster(influxdb、grafana)、EFK(elasticsearch、fluentd、kibana) 集群插件
环境说明

在下面的步骤中,我们将在三台CentOS系统的物理机上部署具有三个节点的kubernetes1.12.3集群。

角色分配如下:
Master:192.168.1.10

Node:192.168.1.11192.168.1.12

注意:192.168.1.10 这台主机 master 和 node 复用。所有生成证书、执行 kubectl 命令的操作都在这台节点上执行。一旦 node 加入到 kubernetes 集群之后就不需要再登陆node节点了。

1.1 集群环境搭建

本文档介绍使用二进制部署最新 kubernetes v1.12.3 集群的所有步骤,而不是使用 kubeadm 等自动化方式来部署集群。

在部署的过程中,将详细列出各组件的启动参数,它们的含义和可能遇到的问题。

部署完成后,你将理解系统各组件的交互原理,进而能快速解决实际问题。

所以本文档主要适合于那些有一定 kubernetes 基础,想通过一步步部署的方式来学习和了解系统配置、运行原理的人。

1.2.1 组件版本和配置策略

1.2.1.1 组件版本

  • Kubernetes 1.12.3
  • Docker 18.09.0-ce
  • Etcd 3.3.10
  • Flanneld 0.10.0
    插件:
  • Coredns
  • Dashboard
  • Heapster (influxdb、grafana)
  • Metrics-Server
  • EFK (elasticsearch、fluentd、kibana)
    镜像仓库:
  • docker registry

1.2.1.2 主要配置策略

kube-apiserver:
  • 使用节点本地 nginx 4 层透明代理实现高可用;
  • 关闭非安全端口 8080 和匿名访问;
  • 在安全端口 6443 接收 https 请求;
  • 严格的认证和授权策略 (x509、token、RBAC);
  • 开启 bootstrap token 认证,支持 kubelet TLS bootstrapping;
  • 使用 https 访问 kubelet、etcd,加密通信;
kube-controller-manager:
  • 3 节点高可用;
  • 关闭非安全端口,在安全端口 10252 接收 https 请求;
  • 使用 kubeconfig 访问 apiserver 的安全端口;
  • 自动 approve kubelet 证书签名请求 (CSR),证书过期后自动轮转;
  • 各 controller 使用自己的 ServiceAccount 访问 apiserver;
kube-scheduler:
  • 3 节点高可用;
  • 使用 kubeconfig 访问 apiserver 的安全端口;
kubelet:
  • 使用 kubeadm 动态创建 bootstrap token,而不是在 apiserver 中静态配置;
  • 使用 TLS bootstrap 机制自动生成 client 和 server 证书,过期后自动轮转;
  • 在 KubeletConfiguration 类型的 JSON 文件配置主要参数;
  • 关闭只读端口,在安全端口 10250 接收 https 请求,对请求进行认证和授权,拒绝匿名访问和非授权访问;
  • 使用 kubeconfig 访问 apiserver 的安全端口;
kube-proxy:
  • 使用 kubeconfig 访问 apiserver 的安全端口;
  • 在 KubeProxyConfiguration 类型的 JSON 文件配置主要参数;
  • 使用 ipvs 代理模式;
集群插件:
  • DNS:使用功能、性能更好的 coredns;
  • Dashboard:支持登录认证;
  • Metric:heapster、metrics-server,使用 https 访问 kubelet 安全端口;
  • Log:Elasticsearch、Fluend、Kibana;
  • Registry 镜像库:docker-registry、harbor;
    harbor私有镜像仓库:参考:https://github.com/goharbor/harbor

1.2.2 系统初始化和全局变量

1.2.2.1 集群机器

master:192.168.1.10
node1:192.168.1.11
node2:192.168.1.12

注意:

  1. 需要在所有机器上执行本文档的初始化命令;
  2. 需要使用具有 root 权限的账号执行这些命令。

1.2.2.2 主机名

设置永久主机名称,然后重新登录:
hostnamectl set-hostname master # 将 master 替换为当前主机名
设置的主机名保存在 /etc/hostname 文件中;
如果 DNS 不支持解析主机名称,则需要修改每台机器的 /etc/hosts 文件,添加主机名和 IP 的对应关系:

cat >> /etc/hosts <<EOF
192.168.1.10 master
192.168.1.11 node1
192.168.1.12 node2
EOF

1.2.2.3 添加 docker 账户

在每台机器上添加 docker 账户:
useradd -m docker

1.2.2.4 无密码 ssh 登录其它节点

如果没有特殊指明,本文所有操作均在 master 节点上执行,然后远程分发文件和执行命令,所以需要添加该节点到其它节点的 ssh 信任关系。
设置 master 可以无密码登录所有节点的 root 账户:

ssh-keygen -t rsa
ssh-copy-id root@master
ssh-copy-id root@node1
ssh-copy-id root@node2

在这里卡了很久,也不知道之前搭建hadoop集群的时候为什么没有遇到的问题在这里出现。使用ssh-copy-id时报ERROR: Host key verification failed.。由于找不到问题原因,只能耍赖将/etc/ssh/ssh_config内的 StrictHostKeyChecking 值改为 no来跳过报错。

1.2.2.5 将可执行文件路径 /opt/k8s/bin 添加到 PATH 变量中

在每台机器上添加环境变量:

echo 'PATH=/opt/k8s/bin:$PATH' >>/root/.bashrc
source /root/.bashrc

1.2.2.6 安装依赖包

在每台机器上安装依赖包:

yum install -y epel-release
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget
/usr/sbin/modprobe ip_vs
如果报Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again。 请参考https://www.cnblogs.com/itor/p/11613783.html
  • ipvs 依赖 ipset;
  • ntp 保证各机器系统时间同步;

1.2.2.7 关闭防火墙

在每台机器上关闭防火墙,清理防火墙规则,设置默认转发策略:

systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
iptables -P FORWARD ACCEPT

1.2.2.8 关闭swap分区

如果开启了 swap 分区,kubelet 会启动失败(可以通过将参数 --fail-swap-on 设置为 false 来忽略 swap on),故需要在每台机器上关闭 swap 分区。同时注释 /etc/fstab 中相应的条目,防止开机自动挂载 swap 分区:

swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

1.2.2.9 关闭 SELinux

关闭 SELinux,否则后续 K8S 挂载目录时可能报错 Permission denied:

setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

1.2.2.10 关闭 dnsmasq(可选)

linux 系统开启了 dnsmasq 后(如 GUI 环境),将系统 DNS Server 设置为 127.0.0.1,这会导致 docker 容器无法解析域名,需要关闭它:

systemctl stop dnsmasq
systemctl disable dnsmasq

1.2.2.11 加载内核模块

modprobe ip_vs_rr
modprobe br_netfilter

1.2.2.12 优化内核参数

这一步如果执行有一些报错不用理会,继续往下执行。

cat > kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.overcommit_memory=1 # 不检查物理内存是否够用
vm.panic_on_oom=0 # 开启 OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
cp kubernetes.conf  /etc/sysctl.d/kubernetes.conf
sysctl -p /etc/sysctl.d/kubernetes.conf
  • 必须关闭 tcp_tw_recycle,否则和 NAT 冲突,会导致服务不通;
  • 关闭 IPV6,防止触发 docker BUG;

1.2.2.13 设置系统时区

# 调整系统 TimeZone
timedatectl set-timezone Asia/Shanghai

# 将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0

# 重启依赖于系统时间的服务
systemctl restart rsyslog 
systemctl restart crond

1.2.2.14 更新系统时间

ntpdate cn.pool.ntp.org

1.2.2.15 关闭无关的服务

systemctl stop postfix && systemctl disable postfix

1.2.2.16 设置 rsyslogd 和 systemd journal

systemd 的 journald 是 Centos 7 缺省的日志记录工具,它记录了所有系统、内核、Service Unit 的日志。
相比 systemd,journald 记录的日志有如下优势:

  1. 可以记录到内存或文件系统;(默认记录到内存,对应的位置为 /run/log/jounal)
  2. 可以限制占用的磁盘空间、保证磁盘剩余空间;
  3. 可以限制日志文件大小、保存的时间;

journald 默认将日志转发给 rsyslog,这会导致日志写了多份,/var/log/messages 中包含了太多无关日志,不方便后续查看,同时也影响系统性能。

mkdir /var/log/journal # 持久化保存日志的目录
mkdir /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
# 持久化保存到磁盘
Storage=persistent

# 压缩历史日志
Compress=yes

SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000

# 最大占用空间 10G
SystemMaxUse=10G

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

# 日志保存时间 2 周
MaxRetentionSec=2week

# 不将日志转发到 syslog
ForwardToSyslog=no
EOF
systemctl restart systemd-journald

1.2.2.17 创建相关目录

创建目录:
mkdir -p /opt/k8s/{bin,work} /etc/{kubernetes,etcd}/cert

1.2.2.18 检查系统内核和模块是否适合运行 docker (仅适用于 linux 系统) 可选

curl https://raw.githubusercontent.com/docker/docker/master/contrib/check-config.sh > check-config.sh
bash ./check-config.sh
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容