kubeadm部署单Master节点k8s1.21集群
k8s 1.21发布
介绍
2021年04月,Kubernetes 1.21正式与大家见面,这是2021 年的第一个版本!这个版本包含 51 个增强功能:13 个增强功能升级为稳定版,16 个增强功能升级为 beta 版,20 个增强功能进入 alpha 版,还有 2 个功能已经弃用
主要变化
CronJobs 毕业到稳定!
自 Kubernetes 1.8 以来,CronJobs一直是一个测试版功能!在 1.21 中,我们终于看到这个广泛使用的 API 毕业到稳定。
CronJobs 用于执行定期计划的操作,如备份、报告生成等。每个任务都应该被配置为无限期地重复出现(例如:一天/一周/一个月);你可以在该间隔内定义作业应该启动的时间点
不可变的 Secrets 和 ConfigMaps
Immutable Secrets和ConfigMaps为这些资源类型添加了一个新字段,如果设置了该字段,将拒绝对这些对象的更改。默认情况下,Secrets 和 ConfigMaps 是可变的,这对能够使用更改的 pod 是有益的。如果将错误的配置推送给使用它们的 pod,可变的 Secrets 和 ConfigMaps 也会导致问题。
通过将 Secrets 和 ConfigMaps 标记为不可变的,可以确保应用程序配置不会改变。如果你希望进行更改,则需要创建一个新的、唯一命名的 Secret 或 ConfigMap,并部署一个新的 pod 来消耗该资源。不可变资源也有伸缩性优势,因为控制器不需要轮询 API 服务器来观察变化
这个特性在 Kubernetes 1.21 中已经毕业到稳定
IPv4/IPv6 双栈支持
IP 地址是一种可消耗的资源,集群操作人员和管理员需要确保它不会耗尽。特别是,公共 IPv4 地址现在非常稀少。双栈支持使原生 IPv6 路由到 pod 和服务,同时仍然允许你的集群在需要的地方使用 IPv4。双堆栈集群网络还改善了工作负载的可能伸缩限制。
Kubernetes 的双栈支持意味着 pod、服务和节点可以获得 IPv4 地址和 IPv6 地址。在 Kubernetes 1.21 中,双栈网络已经从 alpha 升级到 beta,并且已经默认启用了
优雅的节点关闭
在这个版本中,优雅的节点关闭也升级到测试版(现在将提供给更大的用户群)!这是一个非常有益的特性,它允许 kubelet 知道节点关闭,并优雅地终止调度到该节点的 pod。
目前,当节点关闭时,pod 不会遵循预期的终止生命周期,也不会正常关闭。这可能会在许多不同的工作负载下带来问题。接下来,kubelet 将能够通过 systemd 检测到即将发生的系统关闭,然后通知正在运行的 pod,以便它们能够尽可能优雅地终止。
PersistentVolume 健康监测器
持久卷(Persistent Volumes,PV)通常用于应用程序中获取本地的、基于文件的存储。它们可以以许多不同的方式使用,并帮助用户迁移应用程序,而不需要重新编写存储后端。
Kubernetes 1.21 有一个新的 alpha 特性,允许对 PV 进行监视,以了解卷的运行状况,并在卷变得不健康时相应地进行标记。工作负载将能够对运行状况状态作出反应,以保护数据不被从不健康的卷上写入或读取。
减少 Kubernetes 的构建维护
以前,Kubernetes 维护了多个构建系统。这常常成为新贡献者和当前贡献者的摩擦和复杂性的来源。
在上一个发布周期中,为了简化构建过程和标准化原生的 Golang 构建工具,我们投入了大量的工作。这应该赋予更广泛的社区维护能力,并降低新贡献者进入的门槛。
重大变化
弃用 PodSecurityPolicy
在 Kubernetes 1.21 中,PodSecurityPolicy 已被弃用。与 Kubernetes 所有已弃用的特性一样,PodSecurityPolicy 将在更多版本中继续可用并提供完整的功能。先前处于测试阶段的 PodSecurityPolicy 计划在 Kubernetes 1.25 中删除。
接下来是什么?我们正在开发一种新的内置机制来帮助限制 Pod 权限,暂定名为“PSP 替换策略”。我们的计划是让这个新机制覆盖关键的 PodSecurityPolicy 用例,并极大地改善使用体验和可维护性。
弃用 TopologyKeys
服务字段 topologyKeys 现在已弃用;所有使用该字段的组件特性以前都是 alpha 特性,现在也已弃用。我们用一种实现感知拓扑路由的方法替换了 topologyKeys,这种方法称为感知拓扑提示。支持拓扑的提示是 Kubernetes 1.21 中的一个 alpha 特性。你可以在拓扑感知提示中阅读关于替换特性的更多细节;相关的KEP解释了我们替换的背景。
k8s 1.21.0 部署工具介绍
What is Kubeadm ?
Kubeadm is a tool built to provide best-practice "fast paths" for creating Kubernetes clusters. It performs the actions necessary to get a minimum viable, secure cluster up and running in a user friendly way. Kubeadm's scope is limited to the local node filesystem and the Kubernetes API, and it is intended to be a composable building block of higher level tools.
Kubeadm是为创建Kubernetes集群提供最佳实践并能够“快速路径”构建kubernetes集群的工具。它能够帮助我们执行必要的操作,以获得最小可行的、安全的集群,并以用户友好的方式运行。
Common Kubeadm cmdlets
- kubeadm init to bootstrap the initial Kubernetes control-plane node.
初始化
- kubeadm join to bootstrap a Kubernetes worker node or an additional control plane node, and join it to the cluster.
添加工作节点到kubernetes集群
- kubeadm upgrade to upgrade a Kubernetes cluster to a newer version.
更新kubernetes版本
- kubeadm reset to revert any changes made to this host by kubeadm init or kubeadm join.
重置kubernetes集群
k8s 1.21.0 部署环境准备
节点说明
使用CentOS7u9操作系统,然后准备如下配置的三个节点
ip | CPU | 内存 | 硬盘 | 角色 | 主机名 |
---|---|---|---|---|---|
192.168.91.170 | 2C | 2G | 40GB | master | master01 |
192.168.91.171 | 2C | 2G | 40GB | worker(node) | worker01 |
192.168.91.172 | 2C | 2G | 40GB | worker(node) | worker02 |
节点配置
在上面准备的所有节点中操作
基础配置
# 配置hosts
cat >> /etc/hosts << EOF
192.168.91.170 master01
192.168.91.171 worker01
192.168.91.172 worker02
EOF
# 时间同步配置,最小化安装系统需要安装ntpdate软件
yum -y install ntpdate
echo "0 */1 * * * ntpdate time1.aliyun.com" >> /var/spool/cron/root
crontab -l
0 */1 * * * ntpdate time1.aliyun.com
# 关闭防火墙
systemctl disable firewalld && systemctl stop firewalld
firewall-cmd --state
not running
# 永久关闭selinux,一定要重启操作系统后生效
# 修改SELinux配置
sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 临时关闭,不重启操作系统,即刻生效
setenforce 0
升级操作系统内核
# 导入elrepo gpg key
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# 安装elrepo YUM源仓库
yum -y install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
# 安装kernel-ml版本,ml为长期稳定版本,lt为长期维护版本
yum --enablerepo="elrepo-kernel" -y install kernel-ml.x86_64
# 设置grub2默认引导为0
grub2-set-default 0
# 重新生成grub2引导文件
grub2-mkconfig -o /boot/grub2/grub.cfg
# 升级内核需要重启才能生效,重启之前查看老的内核
uname -r
3.10.0-1160.71.1.el7.x86_64
# 重启
reboot
# 重启后,需要验证内核是否为更新对应的版本
uname -r
6.5.7-1.el7.elrepo.x86_64
配置内核转发及网桥过滤
# 添加网桥过滤及内核转发配置文件
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
# 加载br_netfilter模块
modprobe br_netfilter
# 查看是否加载
lsmod | grep br_netfilter
br_netfilter 32768 0
# 加载网桥过滤及内核转发配置文件
sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
安装ipset及ipvsadm
主要用于实现service转发
# 安装ipset及ipvsadm
yum -y install ipset ipvsadm
# 配置ipvsadm模块加载方式,添加需要加载的模块
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
EOF
# 授权、运行、检查是否加载
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack
ip_vs_sh 12288 0
ip_vs_wrr 12288 0
ip_vs_rr 12288 0
ip_vs 200704 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack 188416 1 ip_vs
nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs
nf_defrag_ipv4 12288 1 nf_conntrack
libcrc32c 12288 3 nf_conntrack,xfs,ip_vs
关闭SWAP分区
# 将/etc/fstab文件中swap所在行注掉,然后重启系统,可以永久关闭SWAP分区
sed -i 's&/dev/mapper/centos-swap&#/dev/mapper/centos-swap&' /etc/fstab
cat /etc/fstab | grep swap
#/dev/mapper/centos-swap swap swap defaults 0 0
# 可以临时关闭SWAP分区
swapoff -a
Docker安装
在上面准备的所有节点中操作
# 使用阿里云开源软件镜像站
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 查看可安装版本
yum list docker-ce.x86_64 --showduplicates | sort -r
# 安装指定版本
yum -y install --setopt=obsoletes=0 docker-ce-20.10.9-3.el7
# 修改docker配置
mkdir /etc/docker
# registry-mirrors为镜像加速器配置,登录阿里云在上面获取;exec-opts为cgroup配置
# Docker 在默认情况下使用Vgroup Driver为cgroupfs,而Kubernetes推荐使用systemd来替代cgroupfs
cat << EOF > /etc/docker/daemon.json
{
"registry-mirrors": ["https://zwyx2n3v.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# 设置启动及开机自启动
systemctl enable docker && systemctl start docker
# 查看安装的docker版本
docker version
k8s 1.21.0 集群部署
在上面准备的所有节点中操作
集群软件及版本说明
kubeadm | kubelet | kubectl | |
---|---|---|---|
版本 | 1.21.0 | 1.21.0 | 1.21.0 |
安装位置 | 集群所有节点 | 集群所有节点 | 集群所有节点 |
作用 | 初始化集群、管理集群等 | 用于接收api-server指令,对pod生命周期进行管理 | 集群应用命令行管理工具 |
k8s YUM源准备
阿里云YUM源 developer.aliyun.com/mirror/kube…
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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 list kubeadm.x86_64 --showduplicates | sort -r
yum list kubelet.x86_64 --showduplicates | sort -r
yum list kubectl.x86_64 --showduplicates | sort -r
# 安装指定版本
yum -y install --setopt=obsoletes=0 kubeadm-1.21.0-0 kubelet-1.21.0-0 kubectl-1.21.0-0
配置kubelet
为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容
sed -ri 's/KUBELET_EXTRA_ARGS=/KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"/' /etc/sysconfig/kubelet
# 设置kubelet为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动
systemctl enable kubelet
集群镜像准备
通过阿里云镜像代理下载对应的镜像
kubeadm config images list --kubernetes-version=v1.21.0
k8s.gcr.io/kube-apiserver:v1.21.0
k8s.gcr.io/kube-controller-manager:v1.21.0
k8s.gcr.io/kube-scheduler:v1.21.0
k8s.gcr.io/kube-proxy:v1.21.0
k8s.gcr.io/pause:3.4.1
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns/coredns:v1.8.0
cat > image_download.sh << "EOF"
#!/bin/bash
images_list='
k8s.gcr.io/kube-apiserver:v1.21.0
k8s.gcr.io/kube-controller-manager:v1.21.0
k8s.gcr.io/kube-scheduler:v1.21.0
k8s.gcr.io/kube-proxy:v1.21.0
k8s.gcr.io/pause:3.4.1
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns/coredns:v1.8.0'
for image in $images_list
do
# k8s.gcr.io的相关镜像在国内无法访问,需要替换成registry.aliyuncs.com/google_containers
image_aliyun=`echo $image | sed 's#k8s.gcr.io#registry.aliyuncs.com/google_containers#'`
# coredns需要做特殊处理,删除coredns/
image_aliyun=`echo $image_aliyun | sed 's#coredns/##'`
# 去阿里云拉取对应的镜像
docker pull $image_aliyun
# 重新打成k8s.gcr.io命名的镜像
docker tag $image_aliyun $image
# 删除阿里云对应的镜像
docker rmi $image_aliyun
done
EOF
# 执行脚本下载镜像,可能由于网络原因导致一些镜像下载不了,这个脚本可以多执行几次
sh image_download.sh
# 查看下载的镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
k8s.gcr.io/kube-apiserver v1.21.0 4d217480042e 2 years ago 126MB
k8s.gcr.io/kube-proxy v1.21.0 38ddd85fe90e 2 years ago 122MB
k8s.gcr.io/kube-controller-manager v1.21.0 09708983cc37 2 years ago 120MB
k8s.gcr.io/kube-scheduler v1.21.0 62ad3129eca8 2 years ago 50.6MB
k8s.gcr.io/pause 3.4.1 0f8457a4c2ec 2 years ago 683kB
k8s.gcr.io/coredns/coredns v1.8.0 296a6d5035e2 2 years ago 42.5MB
k8s.gcr.io/etcd 3.4.13-0 0369cf4303ff 3 years ago 253MB
使用 docker playground 下载
通过docker hub登录
# 拉取镜像
docker pull k8s.gcr.io/kube-apiserver:v1.21.0
# 输入dockerhub中的用户名和密码登陆
docker login
# 打一个私有仓库的tag
docker tag k8s.gcr.io/kube-apiserver:v1.21.0 zhangjiabao4/kube-apiserver:v1.21.0
# 推送到私有仓库
docker push zhangjiabao4/kube-apiserver:v1.21.0
# 测试节点中
# 登录dockerhub
docker login
Log in with your Docker ID or email address to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com/ to create one.
You can log in with your password or a Personal Access Token (PAT). Using a limited-scope PAT grants better security and is required for organizations using SSO. Learn more at https://docs.docker.com/go/access-tokens/
Username: zhangjiabao4
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
# 拉取镜像
docker pull zhangjiabao4/kube-apiserver:v1.21.0
v1.21.0: Pulling from zhangjiabao4/kube-apiserver
Digest: sha256:1435e167151f90b7f4abfd416726751c46b8672cc7288507fab7cfa5a05b866c
Status: Downloaded newer image for zhangjiabao4/kube-apiserver:v1.21.0
docker.io/zhangjiabao4/kube-apiserver:v1.21.0
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zhangjiabao4/kube-apiserver v1.21.0 4d217480042e 2 years ago 126MB
# 重新打成k8s.gcr.io命名的镜像
docker tag zhangjiabao4/kube-apiserver:v1.21.0 k8s.gcr.io/kube-apiserver:v1.21.0
上面是以kube-apiserver镜像为例,其它的镜像操作类似
集群初始化
# master01
# 输出内容,一定保留,便于后继操作使用
kubeadm init --kubernetes-version=v1.21.0 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.91.170
[init] Using Kubernetes version: v1.21.0
...
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.91.170:6443 --token 4w2msf.k2sizpdmavfyl89t \
--discovery-token-ca-cert-hash sha256:91f71d52fd2f42b6fe4c77ec86866c15a50f1c5d3f0f16b51545b940acb8930f
集群应用客户端管理集群文件准备
# master01
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
集群网络准备
使用calico部署集群网络 docs.tigera.io/calico/late…
只需要在master01节点操作
calico安装
先查看calico与k8s的兼容性
这里安装calico3.23版本 docs.tigera.io/archive/v3.…
# 下载operator资源清单文件
wget https://projectcalico.docs.tigera.io/archive/v3.23/manifests/tigera-operator.yaml
# 应用资源清单文件,创建operator
kubectl apply -f tigera-operator.yaml
# 监视calico-sysem命名空间中pod运行情况,等待所有pod的STATUS变成Running
watch kubectl get pods -n tigera-operator
# 通过自定义资源方式安装
wget https://projectcalico.docs.tigera.io/archive/v3.23/manifests/custom-resources.yaml
# 修改为使用kubeadm init ----pod-network-cidr对应的IP地址段
sed -i 's/192.168/10.244/' custom-resources.yaml
# 应用资源清单文件
kubectl apply -f custom-resources.yaml
# 监视calico-sysem命名空间中pod运行情况,等待所有pod的STATUS变成Running
watch kubectl get pods -n calico-system
# 删除 master 上的 taint
kubectl taint nodes --all node-role.kubernetes.io/master-
# 已经全部运行
kubectl get pods -n calico-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-988c95d46-r95mj 1/1 Running 0 5m57s
calico-node-vg5sl 1/1 Running 0 5m57s
calico-typha-6564cc4945-d2rzp 1/1 Running 0 5m57s
# 查看kube-system命名空间中coredns状态,处于Running状态表明联网成功。
kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-558bd4d5db-9v4bk 1/1 Running 0 7m55s
coredns-558bd4d5db-bdcvx 1/1 Running 0 7m55s
etcd-master01 1/1 Running 0 8m10s
kube-apiserver-master01 1/1 Running 0 8m10s
kube-controller-manager-master01 1/1 Running 0 8m10s
kube-proxy-vlgrk 1/1 Running 0 7m55s
kube-scheduler-master01 1/1 Running 0 8m10s
calico客户端安装
# 下载二进制文件
curl -L https://github.com/projectcalico/calico/releases/download/v3.23.5/calicoctl-linux-amd64 -o calicoctl
# 安装calicoctl
mv calicoctl /usr/bin/
# 为calicoctl添加可执行权限
chmod +x /usr/bin/calicoctl
# 查看calicoctl版本
calicoctl version
Client Version: v3.23.5
Git commit: 9e0398360
Cluster Version: v3.23.5
Cluster Type: typha,kdd,k8s,operator,bgp,kubeadm
# 通过~/.kube/config连接kubernetes集群,查看已运行节点
DATASTORE_TYPE=kubernetes KUBECONFIG=~/.kube/config calicoctl get nodes
NAME
master01
集群工作节点添加
因容器镜像下载较慢,可能会导致报错,主要错误为没有准备好cni(集群网络插件),如有网络,请耐心等待即可
# 在worker01 和 worker02 节点执行
kubeadm join 192.168.91.170:6443 --token 4w2msf.k2sizpdmavfyl89t \
--discovery-token-ca-cert-hash sha256:91f71d52fd2f42b6fe4c77ec86866c15a50f1c5d3f0f16b51545b940acb8930f
...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
# master01
# 查看网络节点是否添加
DATASTORE_TYPE=kubernetes KUBECONFIG=~/.kube/config calicoctl get nodes
NAME
master01
worker01
worker02
验证集群可用性
# master01
# 监视calico-sysem命名空间中pod运行情况,等待所有pod的STATUS变成Running
watch kubectl get pods -n calico-system
# 查看所有的节点
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 Ready control-plane,master 14m v1.21.0
worker01 Ready <none> 4m13s v1.21.0
worker02 Ready <none> 4m13s v1.21.0
# 查看集群健康情况
# 理想状态
kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health":"true"}
# 真实情况
kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
controller-manager Unhealthy Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused
scheduler Unhealthy Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused
etcd-0 Healthy {"health":"true"}
# 查看kubernetes集群pod运行情况
kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-558bd4d5db-9v4bk 1/1 Running 0 15m
coredns-558bd4d5db-bdcvx 1/1 Running 0 15m
etcd-master01 1/1 Running 0 15m
kube-apiserver-master01 1/1 Running 0 15m
kube-controller-manager-master01 1/1 Running 0 15m
kube-proxy-hks9q 1/1 Running 0 5m1s
kube-proxy-jttr8 1/1 Running 0 5m1s
kube-proxy-vlgrk 1/1 Running 0 15m
kube-scheduler-master01 1/1 Running 0 15m
# 查看calico-system命名空间中pod运行情况
kubectl get pods -n calico-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-988c95d46-r95mj 1/1 Running 0 13m
calico-node-68876 1/1 Running 0 5m22s
calico-node-pj65l 1/1 Running 0 5m22s
calico-node-vg5sl 1/1 Running 0 13m
calico-typha-6564cc4945-d2rzp 1/1 Running 0 13m
calico-typha-6564cc4945-wkz2g 1/1 Running 0 5m18s