一、 概述
本练习使用京东智联云主机和kubeadm创建一个最小化的Kubernetes集群。集群包括两个节点,一个是master节点,一个是node节点。
在集群创建成功之后,使用kubectl在该集群上运行简单的应用。
二、 配置信息
序号 | 资源类型 | 规格 | 数量 |
1 | VPC | N/A | 1 |
2 | Subnet | N/A | 1 |
3 | 公网IP | 带宽1M | 1 |
4 | 云主机 | 2核4GB | 2 |
三、 系统架构
四、 操作步骤
1. 登录京东智联云控制台领取云资源
1.1 登录京东智联云账号
【如有登录有问题,请检查浏览器,一定设置Chrome为默认浏览器】
体验登录网址:https://console.jdcloud.com/
如您为新用户,请注册后登录。如您为老用户,请直接登录。
1.2 领取云资源
点击控制台->账户管理->实名认证->个人实名认证
点击立即认证->从下方三种方式选择认证,建议选择实名手机认证,可快速通过认证
认证成功
添加小助手(ID:jdcloud_dev)回复公开课,进入交流群领取云资源包
(提示:账号实名认证后方可领取)
点击费用管理->代金券管理->余额,查看代金券是否到账。后续可进行动手实操
登录成功后进入控制台后看到如下界面。
2. 创建虚拟专用网VPC
点击云服务->私有网络,选择华北-北京,点击创建。
输入名称,点击确定。
3. 创建子网
点击私有网络->子网,选择华北-北京,点击创建。
输入名称,选择刚刚创建的私有网络VPC-1,点击确定。
4. 创建云主机
点击云产品->云主机
点击“创建”
点击 按配置,地域域选择华北-北京,可用区B
选择本地系统盘
镜像选择Ubuntu Ubuntu 18.04 64位
规格选择 计算优化 标准型 c.n2.large 2核 4GB (如果显示规格售罄,请在上面更换可用区后重试)
存储使用默认配置,网络选择刚刚创建的VPC和子网,安全组选择默认安全组开放全部端口(此安全组仅用于调试、学习,请不要在生产环境使用该安全组),带宽使用默认配置。
输入名称k8s,设置密码,请牢记密码用于后续步骤中登录云主机。
修改购买数量为2,点击立即购买
点击已阅读并同意,点击立即开通。
点击刷新按钮,直到云主机进入运行中状态,并且获得公网IP地址。名称为k8s1的节点将作为master,k8s2将作为node。
5. 使用kubeadm安装单节点kubernetes集群
写在前面:
1. 本操作用例参考kubernetes官方文档Creating a single control-plane cluster with kubeadm https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
2. 本操作用例创建一个单工作节点集群,仅用于学习、实验目的,不能用于生产环境。
3. 使用kubeadm创建集群步骤比较简单,但是由于众所周知的原因,某些在需要在google网站 (google.com, gcr.io) 上下载的资源无法直接下载。本操作用例的一部分内容用于绕过需要从google网站上下载的内容。通过比较本文档与google官方文档,您可以大致区别出来哪些内容是为了避免直接从google网站上下载而特别增加的。作者也会尽力在文档中指出。
4. 大部分操作需要在master和node节点上分别执行一次,文档中会标明该操作需要在哪个节点上执行。
5.1 登录云主机控制台
点“云产品” –“云主机,进入云主机列表页:
在列表页找到master (k8s1)和node (k8s2)的公网IP地址。如果云主机的IP地址未显示,您可以点击刷新按钮。您可能需要1到2分钟以等待云主机各种资源准备完毕。
请使用SSH客户端(推荐下载mobaXterm)远程连接云主机。
以下操作均在ssh客户端远程控制台完成。
5.2 安装Docker
执行节点:k8s1 + k8s2
开始安装Docker软件包:输入 apt update && apt install -y docker.io如下图:
5.3 安装kubenetes组件和kubeadm
[由于无法从google下载软件包,本操作将软件仓库地址改为国内地址]
执行节点:k8s1 + k8s2
apt-get update && apt-get install -y apt-transport-https curl cat <<EOF | tee /etc/apt/sources.list.d/kubernetes.list deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main EOF gpg --keyserver keyserver.ubuntu.com --recv-keys 6A030B21BA07F4FB gpg --export --armor 6A030B21BA07F4FB | apt-key add - apt-get update apt-get install -y kubelet kubeadm kubectl |
在本操作之后,kubelet服务可能无法运行,这是正常的
5.4 下载关键镜像
[由于kubernetes本身需要一些在gcr.io上存放的镜像,这些镜像国内无法正常下载,本操作从国内仓库预先下载这些镜像。这种方式仅用于学习和调试,正式生产环境不能用这种方式]
执行节点:k8s1 + k8s2
#pull-image.sh MY_REGISTRY=gcr.azk8s.cn/google_containers images=$(kubeadm config images list | grep ^k8s.gcr.io | cut -d '/' -f2) for imageName in ${images[@]} ; do docker pull gcr.azk8s.cn/google_containers/$imageName docker tag gcr.azk8s.cn/google_containers/$imageName k8s.gcr.io/$imageName done |
5.5 修改iptable配置
执行节点:k8s1 + k8s2
cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system |
该配置使iptable可以作用于bridge,使kube-proxy可以正常工作。
5.6 初始化cluster
执行节点:k8s1
在master节点上运行:
kubeadm init |
执行成功后会看到如下提示:
执行节点:k8s1
在master节点执行:
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config |
该命令用于配置kubectl客户端所需的必要信息。
执行节点:k8s2
拷贝第二个红框的内容,按照提示,在node节点执行:
kubeadm join [master ip]:6443 --token [example] \ --discovery-token-ca-cert-hash [example] |
成功执行后,将看到如下提示:
5.7 安装cni网络插件
至此集群已经成功创建,我们在master节点可以使用kubectl查看集群状态:
执行节点:k8s1
在master节点上执行:kubectl get node
我们可以看到集群有两个节点,其中一个是master,一个是node。但是两个节点都是NotReady状态,这是因为还没有安装网络插件。(通过kubectl describe node k8s1 可以查看节点NotReady的详细原因)
在master节点上执行以下命令安装网络插件 (calico):
kubectl apply -f https://docs.projectcalico.org/v3.11/manifests/calico.yaml |
5.8 安装完成
执行节点:k8s1
在master节点上执行:kubectl get node
请注意,镜像下载需要一定时间。您可能需要10分钟以上才能看到集群的两个节点都处于Ready状态。
6. 创建应用
6.1 简单应用
执行节点:k8s1
在master节点上执行:kubectl run --generator run-pod/v1 bb --image busybox -- sh -c "echo hello world && sleep 1d"
查看POD运行状态:kubectl get pod
查看POD输出:kubectl logs bb
6.2 创建nginx应用及服务
执行节点:k8s1
在master节点上执行以下命令创建nginx-deploy.yaml:
cat <<EOF > nginx-deploy.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx EOF |
在master节点上执行以下命令创建一个deployment:
kubectl apply -f nginx-deploy.yaml |
在master节点上执行以下命令查看POD:
kubectl get pod |
注意:第一次下载镜像需要一些时间,POD可能要等待10分钟以上才会进入running状态。
在master节点上执行以下命令创建nginx-svc.yaml:
cat <<EOF > nginx-svc.yaml apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 nodePort: 30303 type: NodePort EOF |
在master节点上执行以下命令创建一个service:
kubectl apply -f nginx-svc.yaml |
在master节点上执行以下命令查看service:
kubectl get svc |
使用浏览器访问node节点 (k8s2)的IP地址和端口30303:
7. 结束
恭喜完成所有任务!
请根据个人兴趣继续探索kubernetes。
完毕后请及时释放不再继续使用的资源。
谢谢!
8. 上传练习截图,领取奖励
部署成功后,请将两个练习页面截图形式回复到文章评论区,有机会获得奖励。
链接地址:https://developer.jdcloud.com/topics/912
要求:
Kubernetes集群作业:页面截图+账号名称(参考下图)
账户名称:jdcloudAI_dev
奖励说明:活动时间内成功提交测试结果的,前3名部署成功者可以获得京东智联云音响移动电源套装,第4名-第20名部署成功者可以获得京东Joy公仔一只。
活动时间:
请于2020年4月1日晚20点前提交,2020年4月2日公布结果和领奖方式。