Fork me on GitHub

kubeadm部署k8s集群

1  容器编排工具介绍

容器编排三套解决方案

 kubernetes

 mesos+marathon

 machine+swarn+compose

1.1  Docker提供的容器编排方案

docker compose  单主机编排,只能面向一个docker主机进行编排

docker swarm  编排多主机dokcer,整合一个资源池,而后docker compose只需面向资源池进行编排

docker machine 将一个主机迅速初始化为能符合加入docker swarm集群中的先决条件

 

   

1.2  kubernetes编排方案

1)       k8s特性

自动装箱,自我修复,水平扩展,服务发现和负载均衡,自动发布和回滚,密钥和配置管理,存储编排,批量处理运行

2)       k8s原理

用户把创建、启动容器的请求发动给master,master中的调度器去分析各nodes现有的可用资源状态,找一个最佳适配的,nodes本地的docker engine负责启动起来

3)       Kubernetes组件

master:apiserver, controller-manager, scheduler

nodes: kubelet, kube-proxy, container

附加组件:etcd dashbord等

   4)       逻辑构成:

  • Pod

  label(标签):key=value

  pod分两类:

      自主式的Pod

         控制器管理的pod

 

  • pod控制器

           ReplicationController

              ReplicaSet

           Deployment

                     StatefulSet

                     DaemonSet

                     Job

                     CronJob

                     Horizontal Pod Autoscaler(HPA):自动伸缩pod,访问量猛增,随时扩大pod

  • service: 管理同一类的pod信息,保存变更pod的信息,提供客户端访问
  • CNI

                 flannel:网络配置

                 calico:网络配置、网络策略

                 canel

                 节点网络、集群网络、pod网络

 

                 

 

                 

2   安装前kubernees环境准备

2.1   搭建Kubernetes集群环境有三种方式

1)       Minikube安装方式

Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用。但是这种方式仅可用于学习和测试部署,不能用于生产环境。

https://kubernetes.io/docs/setup/minikube/

2)       Kubeadm安装方式(本次基于该方式)

kubeadm是一个kubernetes官方提供的快速安装和初始化拥有最佳实践(best practice)的kubernetes集群的工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。目前kubeadm还处于beta 和alpha状态,不推荐用在生产环境,但是可以通过学习这种部署方法来体会一些官方推荐的kubernetes最佳实践的设计和思想。

kubeadm的目标是提供一个最小可用的可以通过Kubernetes一致性测试的集群,所以并不会安装任何除此之外的非必须的addon。kubeadm默认情况下并不会安装一个网络解决方案,所以用kubeadm安装完之后,需要自己来安装一个网络的插件。所以说,目前的kubeadm是不能用于生产环境的

https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

3)        二进制包安装方式(生产部署的推荐方式)

从官方下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群,这种方式符合企业生产环境标准的Kubernetes集群环境的安装,可用于生产方式部署。

https://github.com/kubernetes/kubernetes/releases

https://www.cnblogs.com/kevingrace/category/839227.html  #参考

 

#本次安装环境

Kubernetes安装要求:

内核3.10+或4+

docker版本要小于17.03

OS:centos7.4

k8s:v1.20.1

Kubernetes 机器环境:

master, etcd:192.168.100.161

node1:192.168.100.162

node2:192.168.100.163

2.2    环境准备

#配置源、安装基本软件

cd /etc/yum.repos.d/

mkdir bak

mv *.repo bak/

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

yum clean all

yum makecache

yum repolist

yum -y install iproute net-tools lrzsz wget ntp* numactl psmisc vim bridge-util

cd

#时间同步

yum -y install chrony

systemctl enable chronyd.service && systemctl  start chronyd.service

sed -i -e '/^server/s/^/#/' -e '1a server ntp.aliyun.com iburst' /etc/chrony.conf

systemctl restart chronyd.service

#关闭防火墙

systemctl stop firewalld.service && systemctl disable firewalld.service

 

#关闭selinux

setenforce 0

sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

cat /etc/selinux/config  | grep -w "SELINUX"

 

#关闭swap

swapoff -a

sed  -i -r '/swap/s/^/#/' /etc/fstab

free -m

#设置时区

timedatectl set-timezone Asia/Shanghai

#配置hosts和修改主机名

cat /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.100.161 master

192.168.100.162 node01

192.168.100.163 node02

 

#分别修改各主机名

hostnamectl set-hostname master

hostnamectl set-hostname node01

hostnamectl set-hostname node02

 

#修改内核参数

echo "net.bridge.bridge-nf-call-iptables=1" >> /etc/sysctl.conf

echo "net.bridge.bridge-nf-call-ip6tables=1" >> /etc/sysctl.conf

sysctl -p

#如果有如下报错:

sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory

sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory

解决方法:

安装bridge-util软件,加载bridge,br_netfilter模块

yum install -y bridge-utils.x86_64

modprobe bridge

modprobe br_netfilter

chmod +x /etc/rc.local

echo "modprobe bridge" >>/etc/rc.local

echo "modprobe br_netfilter" >>/etc/rc.local

2.3  配置源、安装docker和kubeadm

1)       配置docker源

wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

2)       配置k8s源

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

#添加好以后,查看一下

yum -y repolist

3)       安装docker和kubeadm

yum install -y docker-ce kubelet kubeadm kubectl

systemctl start docker && systemctl enable docker &&systemctl enable kubelet

#kubele设置成开机启动就行,不用现在启动

3      安装k8s (master端操作)

3.1    拉取镜像

[root@master ~]# kubeadm config images list #获取镜像版本

[root@hwsrv-693199 ~]# bash k8s_get_images.sh   #替换下版本号,然后在访问外网的机器上执行

#!/bin/bash
apiserver=k8s.gcr.io/kube-apiserver:v1.20.2
ctrl_manager=k8s.gcr.io/kube-controller-manager:v1.20.2
scheduler=k8s.gcr.io/kube-scheduler:v1.20.2
proxy=k8s.gcr.io/kube-proxy:v1.20.2
pause=k8s.gcr.io/pause:3.2
etcd=k8s.gcr.io/etcd:3.4.13-0
coredns=k8s.gcr.io/coredns:1.7.0

#下载镜像
for i in $apiserver $ctrl_manager $scheduler $proxy $pause $etcd $coredns;do docker pull $i;done
#导出镜像
docker save -o k8s_images.tar.gz $apiserver $ctrl_manager $scheduler $proxy $pause $etcd $coredns
chmod 755 k8s_images.tar.gz
#删除镜像
for i in $apiserver $ctrl_manager $scheduler $proxy $pause $etcd $coredns;do docker rmi $i;done

[root@master ~]# docker load <k8s_images.tar.gz  # 3个节点都需要load

3.2    初始化k8s

[root@master ~]# sed -i 's/KUBELET_EXTRA_ARGS=/KUBELET_EXTRA_ARGS="--fail-swap-on=false"/g' /etc/sysconfig/kubelet

[root@master ~]# kubeadm init --image-repository=k8s.gcr.io --kubernetes-version=v1.20.2 --apiserver-advertise-address=192.168.100.161 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap

--image-repository:这个用于指定从什么位置来拉取镜像(1.13版本才有的),默认值是k8s.gcr.io,我们将其指定为国内镜像地址:registry.aliyuncs.com/google_containers

--kubernetes-version:指定kubenets版本号,默认值是stable-1,会导致从https://dl.k8s.io/release/stable-1.txt下载最新的版本号,我们可以将其指定为固定版本

--apiserver-advertise-address 指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。

--pod-network-cidr指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对  --pod-network-cidr有自己的要求,这里设置为10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。

  3.3    根据初始化的提示配置kubectl

  mkdir -p $HOME/.kube

  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

  sudo chown $(id -u):$(id -g) $HOME/.kube/config

 

[root@master ~]# kubectl get cs  查看集群状态

NAME                 STATUS    MESSAGE              ERROR

controller-manager   Healthy   ok                  

scheduler            Healthy   ok                  

etcd-0               Healthy   {"health": "true"}  

#遇到的问题:

注释掉/etc/kubernetes/manifests下的kube-controller-manager.yaml和kube-scheduler.yaml的- – port=0。

 

[root@master ~]# kubectl get nodes #查看节点信息

NAME                STATUS     ROLES    AGE     VERSION

master.magedu.com   NotReady   master   5m22s   v1.13.4

3.4    安装pod网络

1)       安装Weave网络

export kubever=$(kubectl version | base64 | tr -d '\n')

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"

2)       查看

 [root@master ~]# docker images  #下载下面两个镜像很慢,预计20分钟

 

 kubectl get pods -A

 

kubectl get nodes  #状态改变了

 

  #更多pod网络解决方案,请参考http://docs.kubernetes.org.cn/459.html#34pod

4  node节点加入k8s集群(nodes端操作)

1)       确保node节点上有以下镜像 ,把master上的拿过来就行了

 

#根据maser上 kubeadmin init执行结果的提示,在2台node上分别执行如下命令

kubeadm join 192.168.100.161:6443 --token 9zx9rt.t95m0qis1iyx85oi \

    --discovery-token-ca-cert-hash sha256:1276e8641c573280371e87249f74d2b65bfcc60e76040ff88bd6c078b7cfaef7

 

2)       master中的节点认证信息24小时会失效,可以用下面方法重新生成

#创建token

[root@master ~]# kubeadm token create

#创建新的sha

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

#加入集群

kubeadm join 172.16.20.102:6443 --token 【token】--discovery-token-ca-cert-hash sha256:【sha值】

5   基本使用

1、在master创建一个myapp的应用,副本数量为3

vim myapp-deploy.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: myapp-deploy

spec:

  replicas: 3

  selector:

    matchLabels:

      app: myapp

  template:

    metadata:

      labels:

        app: myapp

    spec:

      containers:

      - name: myapp

        image: ikubernetes/myapp:v1

        ports:

        - containerPort: 80

          name: http

kubectl apply -f myapp-deploy.yaml

可以通过以下一些命令查看应用的状态等信息

kubectl get deployment -w

kubectl get pods -o wide

2、service发布应用

kubectl expose deployment myapp-deploy --name=myapp-svc --port 80

kubectl get svc

3、发布应用,外部可以访问

kubectl edit svc myapp-svc

type: ClusterIP 将 ClusterIP 修改为NodePort

kubectl get svc

在集群外部访问http://192.168.100.167:32602/

4、扩容myapp应用

kubectl scale --replicas=5 deployment myapp-deploy

kubectl get pod -o wide

5、缩容myapp应用

kubectl scale --replicas=3 deployment myapp-deploy

kubectl get pod -o wide

6、滚动更新

#kubectl set image deployment [控制器名] [容器名]=ikubernetes/myapp:v2

kubectl get deployment -o wide

kubectl set image deployment myapp myapp=ikubernetes/myapp:v2

7、查看滚动更新过程

# kubectl rollout status deployment myapp

8、更新完成后,查看镜像版本

# kubectl get deployment myapp -o wide

9、回滚

# kubectl rollout undo deployment myapp

10、删除应用

# kubectl delete deployment myapp

# kubectl delete svc myapp

 

 

 

 

 

 

 

  • 添加到短语集
     
    • 没有此单词集:英语 → ...
       
    • 创建新的单词集...
  • 拷贝
  • 添加到短语集
     
    • 没有此单词集:英语 → ...
       
    • 创建新的单词集...
  • 拷贝
posted @ 2021-01-26 11:27  创始人  阅读(4248)  评论(0编辑  收藏  举报