centos7 安装k8s V1.19.4
一、部署环境主机列表:主机名Centos版本ipdocker versionflannel version主机配置k8s版本master7.8.2003192.168.214.12819.03.13v0.13.0-rc22C2Gv1.19.2node017.8.2003192.168.214.12919.03.13/2C2Gv1.19.2n
目录
node节点直接运行启动命令: kubeadm init 无需初始化master
5.1 修改kubelet配置默认cgroup driver
5.3 初始化master 10.244.0.0/16是flannel固定使用的IP段,设置取决于网络组件要求
5.4 如初始化失败可执行kubeadm reset 命令来清理环境重新安装
7.2 修改recommended.yaml配置文件实现外网访问
7.5 创建dashboard-admin.yaml文件保存以下信息:
一、部署环境
主机列表:
主机名 | Centos版本 | IP | docker version | flannel version | 主机配置 | k8s版本 |
---|---|---|---|---|---|---|
master | 7.8.2003 | 192.168.214.128 | 19.03.13 | v0.13.0-rc2 | 2CPU 2G | v1.19.4 |
node01 | 7.8.2003 | 192.168.214.129 | 19.03.13 | / | 2CPU 2G | v1.19.4 |
node02 | 7.8.2003 | 192.168.214.130 | 19.03.13 | / | 2CPU 2G | v1.19.4 |
安装测试共有3台服务器 1台master,2台node。
服务器是一组云服务器服务器可以通过内网连接的。
官方建议服务器最低配置为2CPU 2GB(至少2GB)或更多的CPU和RAM。
Kubernetes集群组件:
-
etcd 一个高可用的K/V键值对存储和服务发现系统
-
flannel 实现夸主机的容器网络的通信
-
kube-apiserver 提供kubernetes集群的API调用
-
kube-controller-manager 确保集群服务
-
kube-scheduler 调度容器,分配到Node
-
kubelet 在Node节点上按照配置文件中定义的容器规格启动容器
-
kube-proxy 提供网络代理服务
Kubernetes 为你提供:
-
服务发现和负载均衡
Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
-
存储编排
Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
-
自动部署和回滚
你可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态 更改为期望状态。例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。
-
自动完成装箱计算
Kubernetes 允许你指定每个容器所需 CPU 和内存(RAM)。 当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。
-
自我修复
Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的 运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。
-
密钥与配置管理
Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
Kubernetes官方地址:https://kubernetes.io
Kubernetes官方项目地址:https://github.com/kubernetes/kubernetes
二、安装准备工作
2.0 修改主机名
三台服务对应分别执行
主机名可自定义(目前的修改便于区分服务器所在的节点)
# 主节点
[root@centos7 ~] hostnamectl set-hostname master
# 节点1
[root@centos7 ~] hostnamectl set-hostname node01
# 节点2
[root@centos7 ~] hostnamectl set-hostname node02
修改完成后退出重新SSH登陆即可显示新设置的主机名master
2.1 关闭防火墙和关闭selinux
三台服务器全部需要执行
关于关闭防火墙(仅用于测试环境,生产环境请勿使用)
如使用云服务器(如阿里云ECS 到服务器安全组手动增加相关端口)
关闭selinux的原因(关闭selinux以允许容器访问宿主机的文件系统)
# 关闭防火墙和设置开机禁用防火墙
[root@centos7 ~] systemctl stop firewalld && systemctl disable firewalld
# 永久关闭selinux
[root@centos7 ~] sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config;cat /etc/selinux/config
# 临时关闭selinux
root@centos7 ~] setenforce 0
2.2 检查开放Kubernetes各组件所需的端口
Control-plane node(s)
Protocol | Direction | Port Range | Purpose | Used By |
---|---|---|---|---|
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 |
2.3 禁用swap虚拟内存(所有节点都要执行)
master node节点都执行本部分操作。
Swap会导致docker的运行不正常,Kubernetes性能下降。
详情开发人员说明:https://github.com/kubernetes/kubernetes/issues/53533
# 临时禁用
[root@master ~] swapoff -a
# 永久禁用
[root@master ~] sed -i.bak '/swap/s/^/#/' /etc/fstab
2.4 内核参数修改
master node节点都执行本部分操作。
本文的k8s网络使用flannel,该网络需要设置内核参数bridge-nf-call-iptables=1 使桥接流量对iptables可见
# 内核参数临时修改
[root@master ~] sysctl net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-iptables = 1
[root@master ~] sysctl net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-ip6tables = 1
# 内核参数永久修改
[root@master ~] cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 验证是否生效
[root@master ~] sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
2.5 修改hosts文件
# 根据自己服务器的ip进行修改
[root@master ~] cat >> /etc/hosts << EOF
192.168.214.128 master
192.168.214.129 node01
192.168.214.130 node02
EOF
2.6 设置kubernetes源
master node节点都执行本部分操作。
[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
- [] 中括号中的是repository id,唯一,用来标识不同仓库
- name 仓库名称,自定义
- baseurl 仓库地址
- enable 是否启用该仓库,默认为1表示启用
- gpgcheck 是否验证从该仓库获得程序包的合法性,1为验证
- repo_gpgcheck 是否验证元数据的合法性 元数据就是程序包列表,1为验证
- gpgkey=URL 数字签名的公钥文件所在位置,如果gpgcheck值为1,此处就需要指定gpgkey文件的位置,如果gpgcheck值为0就不需要此项了
2.7 更新缓存
[root@master ~] yum clean all
[root@master ~] yum -y makecache
三、Docker配置
master node节点都执行本部分操作。
3.1 命令补全 安装bash-completion
# 安装bash-completion
[root@master ~] yum -y install bash-completion
# 加载bash-completion
[root@master ~] source /etc/profile.d/bash_completion.sh
3.2 docker镜像加速(已经配置请忽略)
由于Docker Hub的服务器在国外,下载镜像会比较慢,本文以阿里加速镜像配置为例。
3.3 登陆阿里云容器模块获取镜像加速地址
3.4 配置镜像加速器
配置daemon.json文件
# 镜像地址需修改为自行获取的镜像加速地址
[root@master ~] mkdir -p /etc/docker
[root@master ~] tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://XXXXXX.mirror.aliyuncs.com"]
}
EOF
# 重启docker
[root@master ~] systemctl daemon-reload
[root@master ~] systemctl restart docker
# 查看docker版本信息
[root@master ~] docker --version
四、k8s安装
master node节点都执行本部分操作。
4.1 kubelet 版本信息查看
[root@master ~] yum list kubelet --showduplicates | sort -r
4.2 安装kubelet、kubeadm和kubectl
[root@master ~] yum install -y kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4
- kubelet 运行在集群所有节点上,用于启动Pod和容器等对象的工具
- kubeadm 用于初始化集群,启动集群的命令工具
- kubectl 用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
4.3 启动kubelet
启动kubelet并设置开机启动
[root@master ~] systemctl enable kubelet && systemctl start kubelet
4.4 kubectl命令补全
[root@master ~] echo "source <(kubectl completion bash)" >> ~/.bash_profile
[root@master ~] source ~/.bash_profile
4.5 镜像下载
Kubernetes几乎所有的安装组件和Docker镜像都放在goolge自己的网站上,直接访问可能会有网络问题,这里的解决办法是从阿里云镜像仓库下载镜像,拉取到本地以后改回默认的镜像tag。本文通过运行image.sh脚本方式拉取镜像。
[root@master ~] vim image.sh
url=registry.aliyuncs.com/google_containers
version=v1.19.4
images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
for imagename in ${images[@]} ; do
docker pull $url/$imagename
docker tag $url/$imagename k8s.gcr.io/$imagename
docker rmi -f $url/$imagename
done
运行脚本image.sh,下载指定版本的镜像
[root@master ~] chmod 775 image.sh
# 运行脚本
[root@master ~] ./image.sh
# 查看已下载的镜像
[root@master ~] docker images
node节点直接运行启动命令: kubeadm init 无需初始化master
五、初始化master
master节点执行本部分操作。
5.1 修改kubelet配置默认cgroup driver
[root@master ~] mkdir -p /var/lib/kubelet/
cat > /var/lib/kubelet/config.yaml <<EOF
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
EOF
# 需要重新启动kubelet
[root@master ~] systemctl restart kubelet
5.2 环境是否正常
[root@master ~] kubeadm init phase preflight
5.3 初始化master 10.244.0.0/16是flannel固定使用的IP段,设置取决于网络组件要求
[root@master ~] kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.19.4
5.4 如初始化失败可执行kubeadm reset 命令来清理环境重新安装
[root@master ~] kubeadm reset
[root@master ~] rm -rf $HOME/.kube/config
5.5 配置master认证
[root@master ~] echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' >> /etc/profile
[root@master ~] source /etc/profile
5.6 安装flannel网络
配置hosts
因为国内网络无法解析raw.githubusercontent.com,因此先访问https://tool.chinaz.com/dns/?type=1&host=raw.githubusercontent.com&ip=查看raw.githubusercontent.com的真实IP,并对应修改host
cat >> /etc/hosts << EOF
151.101.108.133 raw.githubusercontent.com
EOF
在master上新建flannel网络
[root@master ~] kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
六、node节点加入集群
6.1 集群节点查看
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 22h v1.19.4
node01 NotReady <none> 22h v1.19.4
node02 NotReady <none> 22h v1.19.4
6.2 node加入集群
需要root权限 (例如
sudo su -
)首先在master节点上运行获取 token,discovery-token-ca-cert-hash的值
在Node节点上执行:
kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>
# 示例
kubeadm join --token 4xpmwx.nw6psmvn9qi4d3cj 192.168.214.128:6443 --discovery-token-ca-cert-hash sha256:c7cbe95a66092c58b4da3ad20874f0fe2b6d6842d28b2762ffc8d36227d7a0a7
[root@master ~] kubeadm token list
# 输出以下内容
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
8ewj1p.9r9hcjoqgajrj4gi 23h 2018-06-12T02:51:28Z authentication, The default bootstrap system:
signing token generated by bootstrappers:
'kubeadm init'. kubeadm:
default-node-token
默认情况下,令牌会在24小时后过期。如果要在当前令牌过期后将节点加入集群, 则可以通过在控制平面节点上运行以下命令来创建新token令牌:
[root@master ~] kubeadm token create
# 输出以下内容
5didvk.d09sbcov8ph2amjw
获取 --discovery-token-ca-cert-hash 的值:
[root@master ~] openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'
# 输出以下内容
8cb2de97839780a412b93877f8507ad6c94f73add17d5d7058e91741c9d5ec78
如运行kubeadm join -- 加入集群命令出现报错:[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
原因:cgroup和systemd有冲突
[root@node01 ~]# docker info | grep Cgroup
Cgroup Driver: cgroupfs
通过以上命令查到当前的cgroup driver 为cgroupfs,需改为systemd
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
[root@node01 ~]# systemctl daemon-reload
[root@node01 ~]# systemctl restart docker
[root@node01 ~]# docker info | grep Cgroup #再次查看cgroup driver 已改为systemd
Cgroup Driver: systemd
# 再次运行加入集群
[root@node01 ~]# kubeadm join 192.168.191.133:6443 --token xvnp3x.pl6i8ikcdoixkaf0 \
--discovery-token-ca-cert-hash sha256:9f90161043001c0c75fac7d61590734f844ee507526e948f3647d7b9cfc1362d
七、安装Kubernetes Dashboard
Dashboard 只在在master上安装
Kubernetes Dashboard 是 Kubernetes 的官方 Web UI
- 向 Kubernetes 集群部署容器化应用
- 诊断容器化应用的问题
- 管理集群的资源
- 查看集群上所运行的应用程序
- 创建、修改Kubernetes 上的资源(例如 Deployment、Job、DaemonSet等)
- 展示集群上发生的错误
国人开发的Web UI页面: https://kuboard.cn/install/install-dashboard.html
有兴趣可以了解一下,值得推荐。
7.1 下载yaml
[root@master ~] wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml
Dashboard v2.0.4 兼容性
各版本兼容性参照官方说明:https://github.com/kubernetes/dashboard/releases
Kubernetes version | 1.16 | 1.17 | 1.18 | 1.19 |
---|---|---|---|---|
Compatibility | ? | ? | ? | ✓ |
✓
完全支持的版本范围。?
由于Kubernetes API版本之间的重大更改,某些功能在Dashboard中可能无法正常工作。
7.2 修改recommended.yaml配置文件实现外网访问
Dashboard 默认安装只能内网访问,外网访问需要增加 type: NodePort,nodePort: 30001
---
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
# 修改类型为NodePort外网访问
type: NodePort
ports:
- port: 443
targetPort: 8443
# 设置外网端口为 30001
nodePort: 30001
selector:
k8s-app: kubernetes-dashboard
---
7.3 运行部署:
[root@master ~] kubectl apply -f recommended.yaml
7.4 查看状态:
[root@client ~] kubectl get all -n kubernetes-dashboard
# 返回以下信息
NAME READY STATUS RESTARTS AGE
pod/dashboard-metrics-scraper-7b59f7d4df-mqfsz 0/1 ContainerCreating 0 10s
pod/kubernetes-dashboard-665f4c5ff-bdhzd 0/1 ContainerCreating 0 10s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/dashboard-metrics-scraper ClusterIP 10.97.201.169 <none> 8000/TCP 10s
service/kubernetes-dashboard NodePort 10.104.131.77 <none> 443:30001/TCP 10s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/dashboard-metrics-scraper 0/1 1 0 10s
deployment.apps/kubernetes-dashboard 0/1 1 0 10s
NAME DESIRED CURRENT READY AGE
replicaset.apps/dashboard-metrics-scraper-7b59f7d4df 1 1 0 10s
replicaset.apps/kubernetes-dashboard-665f4c5ff 1 1 0 10s
7.5 创建dashboard-admin.yaml文件保存以下信息:
该配置信息dashboard创建新用户,并授予该用户admin权限以及如何使用绑定到该用户的承载令牌登录到Dashboard。
官方文档:https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
7.6 运行以下命令:
[root@master ~] kubectl apply -f dashboard-admin.yaml
7.7 获取创建的 admin 账户的令牌token:
生成的token用于登陆Dashboard
[root@master ~] kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
7.8 正常会打印以下内容:
Name: admin-user-token-v57nw
Namespace: kubernetes-dashboard
Labels: <none>
Annotations: kubernetes.io/service-account.name: admin-user
kubernetes.io/service-account.uid: 0303243c-4040-4a58-8a47-849ee9ba79c1
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1066 bytes
namespace: 20 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3Vud
7.9 外网访问Dashboard页面
Dashboard 页面访问必须是htts:// 方式访问,如谷歌浏览器等无法访问
请使用火狐浏览器访问:https://192.168.214.128:30001(使用自己服务的公网ip访问)
推荐:如有已配置ssl证书的域名使用nginx反向代理(代理URL:https://127.0.0.1:30001)进行访问
登陆页面
操作面板页面
更多推荐
所有评论(0)