Kubernetes集群搭建与应用部署

Kubernetes 功能

  • 服务发现和负载均衡
    Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果到容器的流量很大,Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。

  • 存储编排
    Kubernetes 允许您自动挂载您选择的存储系统,例如本地存储、公共云提供商等。

  • 自动部署和回滚
    您可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态更改为所需状态。例如,您可以自动化 Kubernetes 来为您的部署创建新容器,删除现有容器并将它们的所有资源用于新容器。

  • 自动二进制打包
    Kubernetes 允许您指定每个容器所需 CPU 和内存(RAM)。当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。

  • 自我修复
    Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。

  • 密钥与配置管理
    Kubernetes 允许您存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。您可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

    Secret、Config

    DevOps;应用—>kubernetes对象描述文件。

架构

Kubernetes集群搭建与应用部署_第1张图片

  • master:主控节点。请求都发给master。ui、http-api、
  • kubectl:命令行,操作kubernetes 集群
  • apiserver:收请求->存到etcd
  • controller manager:把 apiserver 需要部署的服务信息详细规格,创建好保存到etcd。
  • scheduler:负责把apiserver,安排信息保存起来。
  • kubelet:问apiserver。每一个工作节点的kubelet。nginx,当前机器kubelet就按照规格启动应用。

部署环境

ip 服务
192.168.1.130 master
192.168.1.131 worker
192.168.1.132 worker

环境要求

  • centos 版本为 7.6 或 7.7、CPU 内核必须大于 2,且内存大于等于 4G
  • hostname 不是 localhost,且不包含下划线、小数点、大写字母
  • 任意节点都有固定的内网 IP 地址(集群机器统一内网)
  • 任意节点上 IP 地址 可互通,且没有防火墙、安全组隔离
  • 任意节点不会直接使用 docker run 或 docker-compose 运行容器。Pod

准备工作

  • 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 查看
systemctl status firewalld
  • 关闭 selinux
swapoff -a  #临时 
sed -ri 's/.*swap.*/#&/' /etc/fstab  #永久
  • 配置host 文件
    vi /etc/hosts
192.168.116.130  guanzc-130
192.168.116.131  guanzc-131
192.168.116.132  guanzc-132
  • 流量配置
#将桥接的 IPv4 流量传递到 iptables 的链:
# 修改 /etc/sysctl.conf
# 如果有配置,则修改
sed -i "s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g"  /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g"  /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g"  /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.all.disable_ipv6.*#net.ipv6.conf.all.disable_ipv6=1#g"  /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.default.disable_ipv6.*#net.ipv6.conf.default.disable_ipv6=1#g"  /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.lo.disable_ipv6.*#net.ipv6.conf.lo.disable_ipv6=1#g"  /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.all.forwarding.*#net.ipv6.conf.all.forwarding=1#g"  /etc/sysctl.conf
# 可能没有,追加
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding = 1"  >> /etc/sysctl.conf
  • 配置生效
sysctl -p

安装docker

  • 卸载旧版docker
sudo yum remove docker \
	docker-client \
	docker-client-latest \
	docker-common \
	docker-latest \
	docker-latest-logrotate \
	docker-logrotate \
	docker-engine
  • 基础环境安装
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
  • 配置yum 源
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • 安装启动
yum install -y docker-ce-19.03.8 docker-ce-cli-19.03.8 containerd.io
systemctl enable docker
systemctl start docker
  • 配置阿里镜像加速
    根据自己账号配置加速,自定百度

Kubernetes 节点初始化

  • 配置Kubernetes yum 源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
  • 卸载旧版本 Kubernetes
yum remove -y kubelet kubeadm kubectl
  • 安装
yum install -y kubelet-1.17.3 kubeadm-1.17.3 kubectl-1.17.3
  • 启动
systemctl enable kubelet && systemctl start kubelet

安装 master 节点

master 节点需要安装:kubernetes、kubelet、kubectl、kubeadm

  • 下载镜像:
    创建 vim master_image.sh
#!/bin/bash
images=(
	kube-apiserver:v1.17.3
    kube-proxy:v1.17.3
	kube-controller-manager:v1.17.3
	kube-scheduler:v1.17.3
	coredns:1.6.5
	etcd:3.4.3-0
    pause:3.1
)
for imageName in ${images[@]} ; do
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done

默认是国外网络,下载比较慢,执行脚本,先下载镜像

  • 查看现在镜像
[root@guanzc-130 bin]# docker images
REPOSITORY                                                                    TAG                 IMAGE ID            CREATED             SIZE
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy                v1.17.3             ae853e93800d        5 months ago        116MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver            v1.17.3             90d27391b780        5 months ago        171MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager   v1.17.3             b0f1517c1f4b        5 months ago        161MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler            v1.17.3             d109c0821a2b        5 months ago        94.4MB
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns                   1.6.5               70f311871ae1        8 months ago        41.6MB
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd                      3.4.3-0             303ce5db0e90        8 months ago        288MB
registry.cn-hangzhou.aliyuncs.com/google_containers/pause                     3.1                 da86e6ba6ca1        2 years ago         742kB

需要镜像,kube-apiserver:v1.17.3、kube-controller-manager:v1.17.3、kube-scheduler:v1.17.3、etcd:3.4.3-0下载完毕

  • 初始化master 节点
kubeadm init \
--apiserver-advertise-address=192.168.1.130 \   # ip地址
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.17.3 \
--service-cidr=10.96.0.0/16 \  # 服务地址,同一个服务用于负载均衡
--pod-network-cidr=192.168.0.0/16  #pod 网络,服务之间相互访问
  • apiserver-advertise-address: 内网ip,ip地址要固定,防止机器重启导致,ip变更,服务不可用
  • 多个网卡时,使用默认网卡ip,通过ip route show 查看

非常重要

Kubernetes集群搭建与应用部署_第2张图片
接下来操作按照提示, 令牌保存下,从节点要用

  • 配置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 apply -f https://docs.projectcalico.org/manifests/calico.yaml
# 网络状态查看
kubectl get pod -n kube-system -o wide
# 查看所有pod 状态
kubectl get pods -A

配置 worker

  • 获取令牌
# 如果忘记,master上执行下面命令
kubeadm token create --print-join-command #打印新令牌,2h有效
kubeadm token create --ttl 0 --print-join-command #创建个永不过期的令牌
  • worker 加入集群
# worker 上执行
kubeadm join 192.168.1.130:6443 --token 6lmulr.c8uj5bek05rcz8l0     --discovery-token-ca-cert-hash sha256:b6ff5ec48f1297455fa070e7a24107d60aad8c3964eef7898c78be47ad391aa3
  • 状态查看
# 节点状态
[root@guanzc-130 ~]# kubectl get nodes 
NAME         STATUS   ROLES    AGE   VERSION
guanzc-130   Ready    master   72m   v1.17.3
guanzc-131   Ready    <none>   12m   v1.17.3
guanzc-132   Ready    <none>   11m   v1.17.3
[root@guanzc-130 ~]# kubectl get cs   # 组件状态
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok                  
controller-manager   Healthy   ok                  
etcd-0               Healthy   {"health":"true"}   
[root@guanzc-130 ~]# 

集群搭建成功

应用部署

  • 部署nginx
# 部署
kubectl create deployment nginx --image=nginx 
# 端口暴露  port nginx 端口,  NodePort 随机暴露
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看服务
[root@guanzc-131 ~]# kubectl get service
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        132m
nginx        NodePort    10.96.163.141   <none>        80:30956/TCP   2m25s
[root@guanzc-131 ~]# 
[root@guanzc-131 ~]# kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
nginx-86c57db685-8tvbr   1/1     Running   0          19m   192.168.109.65   guanzc-132   <none>           <none>
  • 通过 192.168.1.130:30956、 192.168.1.131:30956、 192.168.1.132:30956 都可以正常访问,k8s 默认实现负载均衡。
  • k8s 并不是再每一台服务上都创建了ngix, 节点仅在guanzc-132上存在, 使用docker ps | grep nginx 也可以查看验证
  • 服务自愈测试
    节点部署再132 节点, 将该节点down 机
[root@guanzc-130 ~]# kubectl get nodes
NAME         STATUS     ROLES    AGE    VERSION
guanzc-130   Ready      master   147m   v1.17.3
guanzc-131   Ready      <none>   87m    v1.17.3
guanzc-132   NotReady   <none>   87m    v1.17.3

在这里插入图片描述

  • 132 宕机一段时间后,132节点nginx 终止,131上重新启动了新的服务
  • 自愈期间如果时单节点,服务不可用
  • 动态扩容
kubectl scale --replicas=3 deployment/nginx
# 查看
kubectl get pod -o wide 

总结

三台服务器搭建kubernetes 环境,测试自愈、扩容。

你可能感兴趣的:(kubernetes)