附003.Kubeadm部署Kubernetes
一 kubeadm介绍
1.1 概述
1.2 kubeadm功能
- kubeadm init 启动一个 Kubernetes 主节点;
- kubeadm join 启动一个 Kubernetes 工作节点并且将其加入到集群;
- kubeadm upgrade 更新一个 Kubernetes 集群到新版本;
- kubeadm config 如果使用 v1.7.x 或者更低版本的 kubeadm 初始化集群,您需要对集群做一些配置以便使用 kubeadm upgrade 命令;
- kubeadm token 管理 kubeadm join 使用的令牌;
- kubeadm reset 还原 kubeadm init 或者 kubeadm join 对主机所做的任何更改;
- kubeadm version 打印 kubeadm 版本;
- kubeadm alpha 预览一组可用的新功能以便从社区搜集反馈。
二 kubeadm安装
2.1 前置条件
规则
|
方向
|
端口范围
|
作用
|
使用者
|
TCP
|
Inbound
|
6443*
|
Kubernetes API server
|
All
|
TCP
|
Inbound
|
2379-2380
|
etcd server client API
|
kube-apiserver, etcd
|
TCP
|
Inbound
|
10250
|
Kubelet API
|
Self, Control plane
|
TCP
|
Inbound
|
10251
|
kube-scheduler
|
Self
|
TCP
|
Inbound
|
10252
|
kube-controller-manager
|
Self
|
规则
|
方向
|
端口范围
|
作用
|
使用者
|
TCP
|
Inbound
|
10250
|
Kubelet API
|
Self, Control plane
|
TCP
|
Inbound
|
30000-32767
|
NodePort Services**
|
All
|
2.2 节点规划
节点
|
IP
|
类型
|
Master
|
172.24.8.71
|
Kubernetes master节点
|
node1
|
172.24.8.72
|
Kubernetes node节点1
|
node2
|
172.24.8.73
|
Kubernetes node节点2
|
提示:本实验使用单master部署,生产中可部署奇数个master以做高可用。
2.3 手动添加解析
[root@master ~]# cat <<EOF >> /etc/hosts
172.24.8.71 master
172.24.8.72 node1
172.24.8.73 node2
EOF
2.4 修正iptables
[root@k8s_master ~]# cat <<EOF >> /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
[root@master ~]# modprobe br_netfilter
[root@master ~]# sysctl -p /etc/sysctl.d/k8s.conf
2.5 加载IPVS
[root@master ~]# 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
[root@master ~]# chmod /etc/sysconfig/modules/ipvs.modules
[root@master ~]# bash /etc/sysconfig/modules/ipvs.modules
[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
[root@master ~]# yum -y install ipvsadm
2.6 安装Docker
[root@master ~]# yum -y update
[root@master ~]# yum -y install yum-utils device-mapper-persistent-data lvm2
[root@master ~]# yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@master ~]# yum list docker-ce --showduplicates | sort -r #查看可用版本
[root@master ~]# yum -y install docker-ce-18.09.0-3.el7 #kubeadm当前不支持18.09以上版本
[root@master ~]# mkdir /etc/docker
[root@master ~]# cat > /etc/docker/daemon.json <<EOF
{
"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 #配置system管理cgroup
[root@master ~]# vi /usr/lib/systemd/system/docker.service #更改docker镜像路径
ExecStart=/usr/bin/dockerd-current --data-root=/data/docker #修改为独立的单独路径
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart docker
[root@master ~]# systemctl enable docker
[root@master ~]# iptables -nvL #确认iptables filter表中FOWARD链的默认策略(pllicy)为ACCEPT。
Kubernetes 1.13版本兼容docker版本等可参考:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.13.md。
2.7 相关组件包
2.8 正式安装
[root@master ~]# 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源
[root@master ~]# yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
[root@master ~]# systemctl enable kubelet
2.9 其他调整
[root@master ~]# echo "vm.swappiness=0" >> /etc/sysctl.d/k8s.conf
[root@master ~]# sysctl -p /etc/sysctl.d/k8s.conf
三 初始化最简集群-Mater
3.1 Master上初始化
[root@master ~]# kubeadm init --kubernetes-version=v1.14.0 --pod-network-cidr=10.244.0.0/16
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@master ~]# export KUBECONFIG=$HOME/.kube/config #声明配置文件
- [kubelet-start] 生成kubelet的配置文件”/var/lib/kubelet/config.yaml”
- [certificates]生成相关的各种证书
- [kubeconfig]生成相关的kubeconfig文件
- [bootstraptoken]生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到
3.2 查看集群状态
[root@master ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health":"true"}
四 安装flannel插件
4.1 NIC插件介绍
4.2 下载flannel配置
[root@master ~]# mkdir flannel
[root@master ~]# cd flannel/
[root@master flannel]# wget https://raw.githubusercontent.com/coreos/flannel/62e44c867a2846fefb68bd5f178daf4da3095ccb/Documentation/kube-flannel.yml
[root@master flannel]# kubectl apply -f kube-flannel.yml
[root@master ~]# kubectl get pod --all-namespaces -o wide #查看相关pod
[root@master ~]# kubectl describe node master | grep Taint
Taints: node-role.kubernetes.io/master:NoSchedule
[root@master ~]# kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
[root@master ~]# kubectl get pods --all-namespaces #查看验证
[root@master ~]# kubectl get nodes
五 Node节点安装
5.1 node节点准备
5.2 加入集群
[root@node1 ~]# echo "1" >/proc/sys/net/ipv4/ip_forward
[root@node1 ~]# kubeadm join 172.24.8.71:6443 --token v6xij5.cdhd5h5hspohf1kc \
--discovery-token-ca-cert-hash sha256:94b9a19c3d4b9bd7b4f0ff86a882dad5fe4549b0365626e7f4d26831c9caa0c4
[root@node2 ~]# echo "1" >/proc/sys/net/ipv4/ip_forward
[root@node2 ~]# kubeadm join 172.24.8.71:6443 --token v6xij5.cdhd5h5hspohf1kc \
--discovery-token-ca-cert-hash sha256:94b9a19c3d4b9bd7b4f0ff86a882dad5fe4549b0365626e7f4d26831c9caa0c4
5.3 确认验证
[root@master ~]# kubectl get nodes #节点状态
[root@master ~]# kubectl get cs #组件状态
[root@master ~]# kubectl get serviceaccount #服务账户
[root@master ~]# kubectl cluster-info #集群信息
[root@master ~]# kubectl get pod -n kube-system -o wide #所有服务状态
六 开启IPVS
6.1 修改ConfigMap
[root@master ~]# kubectl edit cm kube-proxy -n kube-system #模式改为ipvs
……
mode: "ipvs"
……
[root@master ~]# kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
[root@master ~]# kubectl get pod -n kube-system | grep kube-proxy #查看proxy的pod
[root@master ~]# kubectl logs kube-proxy-mgqfs -n kube-system #查看任意一个proxy pod的日志
七 集群节点移除
7.1 master节点移除node2
[root@master ~]# kubectl drain node2 --delete-local-data --force --ignore-daemonsets
[root@master ~]# kubectl delete node node2
[root@master ~]# kubectl get nodes
7.2 node2节点重置
[root@node2 ~]# kubeadm reset
[root@node2 ~]# ifconfig cni0 down
[root@node2 ~]# ip link delete cni0
[root@node2 ~]# ifconfig flannel.1 down
[root@node2 ~]# ip link delete flannel.1
[root@node2 ~]# rm -rf /var/lib/cni/
7.3 卸载(删除)集群
八 测试集群
8.1 创建测试service
[root@master ~]# kubectl run nginx --replicas=2 --labels="run=load-balancer-example" --image=nginx --port=80
[root@master ~]# kubectl expose deployment nginx --type=NodePort --name=example-service #暴露端口
[root@master ~]# kubectl get service #查看服务状态
[root@master ~]# kubectl describe service example-service #查看信息
8.2 测试访问
[root@master ~]# curl 10.102.244.218:80
[root@master ~]# kubectl get pod -o wide #查看endpoint
[root@master ~]# curl 10.244.3.2:80 #访问endpoint,与访问服务ip结果相同
[root@master ~]# curl 10.244.1.2:80
附一:kubeadm init参数
--apiserver-advertise-address string:API Server将要广播的监听地址。如指定为`0.0.0.0` 将使用缺省的网卡地址。
--apiserver-bind-port int32:API Server绑定的端口,缺省值: 6443
--apiserver-cert-extra-sans stringSlice:可选的额外提供的证书的别名,(SANs)用于指定API Server的服务器证书。可以是IP地址也可以是DNS名称。 --cert-dir string:证书的存储路径,缺省值: "/etc/kubernetes/pki"
--config string:kubeadm配置文件的路径。
--cri-socket string:指明要连接的CRI socket文件,缺省值: "/var/run/dockershim.sock"
--dry-run:不会应用任何改变,只会输出将要执行的操作,即测试运行。
--feature-gates string:键值对的集合,用来控制各种功能的开关。可选项有:
Auditing=true|false (当前为ALPHA状态 - 缺省值=false)
CoreDNS=true|false (缺省值=true)
DynamicKubeletConfig=true|false (当前为BETA状态 - 缺省值=false)
-h, --help:获取init命令的帮助信息。
--ignore-preflight-errors stringSlice:忽视检查项错误列表,列表中的每一个检查项如发生错误将被展示输出为警告,而非错误。例如: 'IsPrivilegedUser,Swap'. 如填写为 'all' 则将忽视所有的检查项错误。
--kubernetes-version string:为control plane选择一个特定的Kubernetes版本,缺省值: "stable-1"
--node-name string:指定节点的名称。
--pod-network-cidr string:指明pod网络可以使用的IP地址段。如果设置了这个参数,control plane将会为每一个节点自动分配CIDRs。
--service-cidr string:为service的虚拟IP地址另外指定IP地址段,缺省值: "10.96.0.0/12"
--service-dns-domain string:为services另外指定域名, 例如: "myorg.internal",缺省值: "cluster.local"
--skip-token-print:不打印出由 `kubeadm init` 命令生成的默认令牌。
--token string:这个令牌用于建立主从节点间的双向受信链接。格式为 [a-z0-9]{6}\.[a-z0-9]{16} - 示例:abcdef.0123456789abcdef
--token-ttl duration:令牌被自动删除前的可用时长 (示例: 1s, 2m, 3h). 如果设置为 '0', 令牌将永不过期。缺省值: 24h0m0s
附二:kubeadm init过程
- kubeadm init 命令通过执行下列步骤来启动一个 Kubernetes master 节点。
- 在做出变更前运行一系列的预检项来验证系统状态。一些检查项目仅仅触发警告,其它的则会被视为错误并且退出 kubeadm,除非问题被解决或者用户指定了 --ignore-preflight-errors=<list-of-errors> 参数。
- 生成一个自签名的 CA证书 (或者使用现有的证书,如果提供的话) 来为集群中的每一个组件建立身份标识。如果用户已经通过 --cert-dir 配置的证书目录(缺省值为 /etc/kubernetes/pki)提供了他们自己的 CA证书 以及/或者 密钥, 那么将会跳过这个步骤。如果指定了 --apiserver-cert-extra-sans 参数, APIServer 的证书将会有额外的 SAN 条目,如果必要的话,将会被转为小写。
- 将 kubeconfig 文件写入 /etc/kubernetes/ 目录以便 kubelet、controller-manager 和 scheduler 用来连接到 API server,它们每一个都有自己的身份标识,同时生成一个名为 admin.conf 的独立的 kubeconfig 文件,用于管理操作。
- 如果 kubeadm 被调用时附带了 --feature-gates=DynamicKubeletConfig 参数, 它会将 kubelet 的初始化配置写入 /var/lib/kubelet/config/init/kubelet 文件中。 这个功能现在是默认关闭的,但是在未来的版本中很有可能会默认启用。
- 为 API server、controller manager 和 scheduler 生成静态 Pod 的清单文件。假使没有提供一个外部的 etcd 服务的话,也会为 etcd 生成一份额外的静态 Pod 清单文件。
- 静态 Pod 的清单文件被写入到 /etc/kubernetes/manifests 目录,kubelet 会监视这个目录以便在系统启动的时候创建 Pods。
- 一旦 control plane 的 Pods 都运行起来, kubeadm init 的工作流程就继续往下执行。
- 如果 kubeadm 被调用时附带了 --feature-gates=DynamicKubeletConfig 参数, 它将创建一份 ConfigMap 和一些便于 kubelet 访问这份 ConfigMap 的 RBAC 规则,并且通过将 Node.spec.configSource 指向到新创建的 ConfigMap 来更新节点设置。这样它就完成了对 Kubelet 的动态配置。 这个功能现在是默认关闭的,但是在未来的版本中很有可能会默认启用。
- 对 master 节点应用 labels 和 taints 以便不会在它上面运行其它的工作负载。
- 生成令牌以便其它节点以后可以使用这个令牌向 master 节点注册它们自己。 可选的,用户可以通过 --token 提供一个令牌。
- 为了使得节点能够遵照 Bootstrap Tokens 和 TLS Bootstrap这两份文档中描述的机制加入到集群中,kubeadm 会执行所有的必要配置:
- 创建一份 ConfigMap 提供添加集群节点所需的信息,并为该 ConfigMap 设置相关的 RBAC 访问规则。
- 使得 Bootstrap Tokens 可以访问 CSR 签名 API。
- 对新的 CSR 请求配置为自动签发。
附003.Kubeadm部署Kubernetes的更多相关文章
- 附025.kubeadm部署Kubernetes更新证书
一 查看证书 1.1 查看过期时间-方式一 1 [root@master01 ~]# tree /etc/kubernetes/pki/ 2 [root@master01 ~]# for tls in ...
- 附012.Kubeadm部署高可用Kubernetes
一 kubeadm介绍 1.1 概述 参考<附003.Kubeadm部署Kubernetes>. 1.2 kubeadm功能 参考<附003.Kubeadm部署Kubernetes& ...
- 使用kubeadm部署Kubernetes v1.13.3
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: 1. 安装要求 在开始之前,部署Kubernetes集群 ...
- [原]使用kubeadm部署kubernetes(一)
####################### 以下为声明 ##################### 在公众号 木子李的菜田 输入关键词: k8s 有系列安装文档 此文档是之前做笔记在 ...
- [转帖]CentOS 7 使用kubeadm 部署 Kubernetes
CentOS 7 使用kubeadm 部署 Kubernetes 关闭swap 执行swapoff临时关闭swap. 重启后会失效,若要永久关闭,可以编辑/etc/fstab文件,将其中swap分 ...
- 02 . Kubeadm部署Kubernetes及简单应用
kubeadm部署Kubernetes kubeadm简介 # kubeadm是一位高中生的作品,他叫Lucas Kaldstrom,芬兰人,17岁用业余时间完成的一个社区项目: # kubeadm的 ...
- Kubeadm部署Kubernetes
Kubeadm部署Kubernetes 1.环境准备 主机名 IP 说明 宿主机系统 k8s-master 10.0.0.101 Kubernetes集群的master节点 Ubuntu2004 k8 ...
- 使用kubeadm部署Kubernetes集群
一.环境架构与部署准备 1.集群节点架构与各节点所需安装的服务如下图: 2.安装环境与软件版本: Master: 所需软件:docker-ce 17.03.kubelet1.11.1.kubeadm1 ...
- kubeadm部署Kubernetes集群
Preface 通过kubeadm管理工具部署Kubernetes集群,相对离线包的二进制部署集群方式而言,更为简单与便捷.以下为个人学习总结: 两者区别在于前者部署方式使得大部分集群组件(Kube- ...
随机推荐
- Codeves 4279 线段树练习5
有n个数和5种操作 add a b c:把区间[a,b]内的所有数都增加c set a b c:把区间[a,b]内的所有数都设为c sum a b:查询区间[a,b]的区间和 max a b:查询区间 ...
- mysql 根据某个值叠加查询
今天看到需求 根据输入用户ID由近到远排列 怎么会有这种需求??? 直接上代码 SELECT * FROM Member, ( (SELECT ABS(ID-900) as Sorting,ID FR ...
- Django对DateTimeField时间字段查询QuerySet为空的解决方案
今天在用的Django中的filter()方法对DateTimeField字段查询时碰到了问题,抓耳挠腮一下午,终于解决了,我觉得花了一下午的时间怎么着也得记录下吧(无语)...... 问题描述 : ...
- Django基础day01
后端(******) 软件开发结构c/s http协议的由来 sql语句的由来 统一接口统一规范 HTTP协议 1.四大特性 1.基于TCP/IP作用于应用层之上的协议 2.基于请求响应 3.无状态 ...
- 安卓逆向基础(001)-APK安装流程
1.在/data/app下以报名为文件夹名新建文件夹 APK包存放在这里 以及lib文件 存放so 2./data/dalvik-cache 存放dex dex是dalvik虚拟机可执行文件 3./d ...
- Redis-API
Redis-API 简介 Redis 是一个基于内存的高效的键值行非关系型数据库,存取效率极高. python提供了两个类:分别为Redis和StrictRedis来实现Redis的命令操作.Redi ...
- 阿里云服务器部署Tornado应用
本篇详细介绍tornado应用部署到阿里云服务器上的全过程. Tornado程序地址:github https://github.com/ddong8/ihasy.git 准备工作:阿里云服务器Cen ...
- B站上传字幕问题解决
博客:blog.shinelee.me | 博客园 | CSDN B站上传字幕时,如果srt文件中出现如下空行,则会报错,仅上传了空行前的部分 于是写了个python脚本,如下: import pys ...
- centos7安装python3.7.4
yum install gcc make zlib zlib-devel openssl openssl-devel libffi-devel bzip2-devel ncurses-devel g ...
- Leetcode92: Reverse Linked List II 翻转链表问题
问题描述 给定一个链表,要求翻转其中从m到n位上的节点,返回新的头结点. Example Input: 1->2->3->4->5->NULL, m = 2, n = 4 ...