如何在Kubernetes群集上安装,配置和部署NGINX

什么是Kubernetes?

Kubernetes是一个基于Google Borg的开源容器管理系统。它可以配置为提供高度可用的,水平自动缩放的自动部署。本指南介绍如何在Linode上设置Kubernetes集群并管理NGINX服务的生命周期。

准备

你会需要:

  • 两个或多个具有私有IP的Linode
  • 每个Linode应该是64位的:
    • Ubuntu 16.04+
    • Debian 9
    • CentOS 7
    • RHEL 7
    • Fedora 26
  • 每个Linode至少2GB RAM
  • root或sudo权限,用于安装和配置Kubernetes。任何用户配置完成后都可以与群集进行交互。

为Kubernetes准备主机Linode

本指南中的步骤创建一个双节点群集。评估您自己的资源需求,并根据您的需求启动适当大小的群集。

  1. 在同一数据中心内创建两个内存至少为2GB的Linode。
  2. 对于每个节点,进入Linode Manager的Remote Access选项卡并添加专用IP。可以在数据中心之间使用公共IP构建Kubernetes集群,但性能和安全性可能会受到影响。
  3. 使用UFWiptables配置防火墙,以确保只有两个节点可以相互通信。

禁用交换内存

Linodes默认启用交换内存。kubelet不支持交换内存,如果交换处于活动状态或甚至存在于您的/etc/fstab文件中,则无法使用。

/etc/fstab应该是这个样子:

/ etc / fstab

1 2 3 4 5 6 7 8 9 10

# /etc/fstab: static file system information. # # use 'blkid' to print the universally unique identifier for a # device; this may be used with uuid= as a more robust way to name devices # that works even if disks are added and removed. see fstab(5). # # <file system> <mount point> <type> <options> <dump> <pass> # / was on /dev/sda1 during installation /dev/sda / ext4 noatime,errors=remount-ro 0 1 /dev/sdb none swap sw 0 0

  1. 删除描述交换分区的行。在这个例子中,第10行用/dev/sdb
  2. 禁用交换内存使用: swapoff -a

为Kubernetes Nodes 设置主机名

要使本指南中的命令更易于理解,请在每台计算机上设置主机名和托管文件。

  • 选择一个节点作为您的Kubernetes主节点并通过SSH进入其中。
  • 编辑/etc/hostname并添加: /etc/hostname kube-master
  • 将以下行添加到/etc/hosts: / etc / hosts

<kube-master-private-ip> kube-master

<kube-worker-private-ip> kube-worker-1

如果您有两个以上的节点,也可以添加其私有IP /etc/hosts。 为了便于以后理解输出和调试问题,根据其作用(考虑命名每个主机名kube-worker-1kube-worker-2等等)。

  • 在每个工作节点上执行步骤2和3,相应地更改值。
  • 要使更改生效,请重新启动Linode。

确认主机名

重新启动节点后,请登录每个节点以确认更改。

检查:

  • $ hostname 在终端输出预期的主机名。
  • 您可以通过其主机名ping群集中的所有节点。
  • 使用时在所有节点上正确禁用交换cat /proc/swaps

如果您无法通过其主机名或私有IP ping任何主机:

  1. SSH进入没有响应的主机。
  2. 输入ifconfig。您应该看到一个条目eth0:1列出您的私有IP。如果eth0:1未列出,则可能在将私有IP添加到基础主机之前部署了Linode映像。重新创建图像并返回到指南的开头。

在Linode 上安装Docker和Kubernetes

Debian / Ubuntu:

apt install ebtables ethtool

CentOS的/ RHEL:

yum install ebtables ethtool

安装Docker

这些步骤使用官方Ubuntu存储库安装Docker Community Edition(CE)。要在其他发行版上安装,请参阅官方安装页面

  1. 删除系统上可能存在的旧版Docker: sudo apt remove docker docker-engine docker.io
  2. 确保您拥有必要的软件包以允许使用Docker的存储库: sudo apt install apt-transport-https ca-certificates curl software-properties-common
  3. 添加Docker的GPG密钥: curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  4. 验证GPG密钥的指纹: sudo apt-key fingerprint 0EBFCD88 您应该看到类似于以下内容的输出: pub 4096R/0EBFCD88 2017-02-22 Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 uid Docker Release (CE deb) <docker@docker.com> sub 4096R/F273FCD8 2017-02-22
  5. 添加stableDocker存储库: sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  6. 更新软件包索引并安装Docker CE: sudo apt update sudo apt install docker-ce
  7. 将有限的Linux用户帐户添加到该docker组: sudo usermod -aG docker exampleuser 您需要重新启动shell会话才能使此更改生效。
  8. 通过运行内置的“Hello World”程序检查安装是否成功: docker run hello-world

安装kubeadm,kubectl和kubelet

Debian / Ubuntu:

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo 'deb http://apt.kubernetes.io/ kubernetes-xenial main' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet kubeadm kubectl

CentOS的/ RHEL:

cat <<eof > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
      https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
eof
setenforce 0
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet

Kubernetes Master和Slave

配置Kubernetes主节点

  • 在主节点上使用其私有IP初始化您的群集: kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=<private IP> 如果遇到表明已启用交换的警告,请返回“ 禁用交换内存”部分。 如果成功,您的输出将类似于: To start using your cluster, you need to run (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 You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: http://kubernetes.io/docs/admin/addons/ You can now join any number of machines by running the following on each node as root: kubeadm join --token 921e92.d4582205da623812 :6443 --discovery-token-ca-cert-hash sha256:bd85666b6a97072709b210ddf677245b4d79dab88d61b4a521fc00b0fbcc710c
  • 在主节点上,配置kubectl工具: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 检查节点的状态kubectl get nodes。输出将类似于: root@kube-master:~# kubectl get nodes name status roles age version kube-master NotReady master 1m v1.8.1 列出主节点是NotReady因为群集没有容器网络接口(CNI)。CNI是基于容器的网络接口的规范。在本指南中,我们将使用Calico。或者,您可以使用法兰绒或其他CNI获得类似的结果。 “ 配置Kubernetes主节点”部分中--pod-network-cidr使用的参数定义了CNI的网络范围。
  • 仍在主节点上时,运行以下命令将CNI部署到您的集群: kubectl apply -f https://docs.projectcalico.org/v2.6/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml
  • 要确保正确设置Calico,请使用kubectl get pods --all-namespaces以查看在kube-system命名空间中创建的pod : root@kube-master:~# kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system calico-etcd-nmx26 1/1 Running 0 48s kube-system calico-kube-controllers-6ff88bf6d4-p25cw 1/1 Running 0 47s kube-system calico-node-bldzb 1/2 CrashLoopBackOff 2 48s kube-system calico-node-k5c9m 2/2 Running 0 48s kube-system etcd-master 1/1 Running 0 3m kube-system kube-apiserver-master 1/1 Running 0 3m kube-system kube-controller-manager-master 1/1 Running 0 3m kube-system kube-dns-545bc4bfd4-g8xtm 3/3 Running 0 4m kube-system kube-proxy-sw562 1/1 Running 0 4m kube-system kube-proxy-x6psn 1/1 Running 0 1m kube-system kube-scheduler-master 1/1 Running 0 3m

此命令使用该-n标志。该-n标志是一个全局kubectl标志,用于选择非默认名称空间。我们可以通过运行来查看现有的名称空间kubectl get namespaces: root@kube-master:~# kubectl get namespaces NAME STATUS AGE default Active 4h kube-public Active 4h kube-system Active 4h

  • kubectl get nodes再次运行以查看主节点现在正在正常运行: root@kube-master:~# kubectl get nodes name status roles age version kube-master Ready master 12m v1.8.1

将节点添加到Kubernetes群集

  1. kubeadm join使用kube-master主机名运行以添加第一个worker: kubeadm join --token <some-token> kube-master:6443 --discovery-token-ca-cert-hash sha256:<some-sha256-hash>
  2. 在主节点上,用于kubectl查看从节点现在是否已就绪: root@kube-master:~# kubectl get nodes name status roles age version kube-master ready master 37m v1.8.1 kube-worker-1 ready 2m v1.8.1

在Kubernetes集群上部署NGINX

部署是逻辑参照荚或豆荚和它们的配置。

  • 从主节点kubectl create进行nginx部署: kubectl create deployment nginx --image=nginx
  • 这会创建一个名为的部署nginxkubectl get deployments列出所有可用部署: kubectl get deployments
  • 使用kubectl describe deployment nginx可查看详细信息: Name: nginx Namespace: default CreationTimestamp: Sun, 15 Oct 2017 06:10:50 +0000 Labels: app=nginx Annotations: deployment.kubernetes.io/revision=1 Selector: app=nginx Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 1 max unavailable, 1 max surge Pod Template: Labels: app=nginx Containers: nginx: Image: nginx Port: Environment: Mounts: Volumes: Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable OldReplicaSets: NewReplicaSet: nginx-68fcbc9696 (1/1 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 1m deployment-controller Scaled up replica set nginx-68fcbc9696 to 1 该describe命令允许您在更深层次上查询不同的kubernetes资源,例如pod,部署和服务。上面的输出表明nginx在默认命名空间内调用了部署。此部署只有一个复制,并且正在运行docker镜像nginx。端口,底座,体积和环境变量都未设置。
  • 通过互联网访问NGINX容器: kubectl create service nodeport nginx --tcp=80:80 这将在主机上为NGINX部署创建面向公众的服务。因为这是一个节点端口部署,kubernetes将在32000+范围内为主机上的端口分配此服务。 尝试get当前的服务: root@kube-master:~# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5h nginx NodePort 10.98.24.29 <none> 80:32555/TCP 52s
  • 通过curl在从属节点上使用来验证NGINX部署是否成功: root@kube-master:~# curl kube-worker-1:32555 输出将显示未呈现的“欢迎使用nginx!”页面HTML。
  • 要删除部署,请使用kubectl delete deployment: root@kube-master:~# kubectl delete deployment nginx deployment "nginx" deleted root@kube-master:~# kubectl get deployments No resources found.

更多信息

有关此主题的其他信息,您可能需要参考以下资源。虽然提供这些是希望它们有用,但请注意,我们无法保证外部托管材料的准确性或及时性。

更多教程请前往腾讯云+社区学习更多知识。

参考文献:《How to Install, Configure, and Deploy NGINX on a Kubernetes Cluster》

本文的版权归 阿小庆 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Maroon1105

使用Terraform配置Linode环境

基础架构代码(IaC)是一种软件,使开发人员能够使用高级配置语法构建,管理和配置计算环境。一些好处包括能够实施DevOps最佳实践,流程自动化以及使用版本控制系...

41030
来自专栏写代码的海盗

Docker学习总结之Run命令介绍 Operator exclusive options

Docker学习总结之Run命令介绍 本文由Vikings(http://www.cnblogs.com/vikings-blog/) 原创,转载请标明.谢谢!...

33750
来自专栏大魏分享(微信公众号:david-share)

Look,容器中应用的构建方法!

S2I增量构建重用以前构建的image中的工件 要创建增量构建,请修改BuildConfig策略定义:

18730
来自专栏眯眯眼猫头鹰的小树杈

猫头鹰的深夜翻译:持久化容器存储

临时性存储是容器的一个很大的买点。“根据一个镜像启动容器,随意变更,然后停止变更重启一个容器。你看,一个全新的文件系统又诞生了。”

19350
来自专栏小狼的世界

Kubernetes基础

Kubernetes是当今最流行的开源容器管理平台,它就是大名鼎鼎的Google Borg的开源版本。Google在2014年推出了Kubernetes,本文发...

33420
来自专栏腾讯云TStack专栏

qemu-kvm中vcpu虚拟化到底是咋整的?

一句话总结 实例化一个vcpu就是在hostOS中创建了一个线程,线程里有个while循环,循环里不停的调用kvm_cpu_exec方法,kvm_cpu_e...

804100
来自专栏大魏分享(微信公众号:david-share)

OpenShift企业版安装:单Master集群

OpenShift企业版安装:单Master集群 项目描述本文目的本文描述搭建红帽OpenShift容器平台单Master集群的过程。 适合用于在没有互联网连接...

2.4K30
来自专栏机器之心

专栏 | 新手入门?一步一步教你如何安装PaddlePaddle

机器之心发布 来源:百度PaddlePaddle 不久之前,机器之心联合百度推出 PaddlePaddle 专栏,为想要学习这一平台的技术人员推荐相关教程与资源...

58170
来自专栏北京马哥教育

KVM虚拟化平台部署及管理

前言 KVM即Kernel Virtual Machine,最初是由以色列公司Qumranet开发。2007年2月被导入Linux 2.6.20核心中,成为内核...

55770
来自专栏杂文共赏

使用DCHQ自动部署和管理Docker Cloud /虚拟Java微服务

本文演示了一个在云或虚拟平台上,用于自动化部署和管理Docker Java微服务应用程序的解决方案。我们通过扩展现有项目Chris Richardson的示例—...

22140

扫码关注云+社区

领取腾讯云代金券