(2.1)kubeadm部署k8s(原创)

目录

1、kubernetes 官方提供的三种部署方式

2、安装前的准备

2.1、查看centos版本

2.2、关闭防火墙

2.3、关闭setlinux

2.4、关闭swap

2.5、master与node创建密钥

2.6、安装同步时钟

2.7、内核调整,将桥接的IPv4流量传递到iptables的链

2.8、禁用NetworkManager

3、安装kubernetes和docker

4、启动kubernetes集群

  4.1 kubeadm init

  4.2 node节点加入集群

5、安装网络插件

6、测试Kubernetes集群


另外也有一篇很好的安装文章https://kubesphere.com.cn/forum/d/1272-kubeadm-k8s-kubesphere-2-1-1

 

1、kubernetes 官方提供的三种部署方式

  • minikube

Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,仅用于尝试Kubernetes或日常开发的用户使用。部署地址:https://kubernetes.io/docs/setup/minikube/

  • kubeadm

Kubeadm也是一个工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。部署地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

  • 二进制包

推荐,从官方下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。下载地址:https://github.com/kubernetes/kubernetes/releases

 

 

本章安装好的版本是

[root@master ~]# kubelet --version
Kubernetes v1.16.0

2、安装前的准备

2.1、查看centos版本

rpm -q centos-release
或者
cat /etc/redhat-release

准备3各节点

192.168.10.11 master
192.168.10.12 node1
192.168.10.13 node2

实现代码:

vi /etc/hostname  # 设定节点名称

vi /etc/hosts     # 设定节点ip对应关系

2.2、关闭防火墙

systemctl stop firewalld && systemctl disable firewalld​

查看

systemctl status firewalld
显示Active: inactive (dead) 就OK

 

2.3、关闭setlinux

关闭setlinux-临时关闭

setenforce 0

关闭setlinux-永久关闭

vim /etc/selinux/config

SELINUX=enforcing改为SELINUX=disabled,保存后退出

查看:

getenforce

要显示disabled

2.4、关闭swap

swap的作用类似Windows系统下的“虚拟内存”

查看

free -g

# 永久关闭swap分区
$ sudo swapoff -a 
$ sudo sed -i 's/.*swap.*/#&/' /etc/fstab

查看

2.5、master与node创建密钥

参考:https://blog.csdn.net/allensandy/article/details/101473338

验证:

ssh root@node1

ssh root@node2

2.6、安装同步时钟

# yum install -y ntpdate

# ntpdate time.windows.com

2.7、内核调整,将桥接的IPv4流量传递到iptables的链


配置系统内核参数使流过网桥的流量也进入iptables/netfilter框架中

 cat > /etc/sysctl.d/k8s.conf << EOF
 net.bridge.bridge-nf-call-ip6tables = 1
 net.bridge.bridge-nf-call-iptables = 1
 EOF

 sysctl -p
 注:如果上面执行sysctl -p时报错,可以先执行一下modprobe br_netfilter,然后再重新执行sysctl -p

2.8、禁用NetworkManager

生产环境下一般使用手动配置网络,以静态地址为主不需要系统的网络管理工具,因此,将其禁用。

systemctl stop NetworkManager
systemctl disable NetworkManager

查看

systemctl status NetworkManager

显示 Active: inactive (dead) 就OK

3、安装kubernetes和docker

  • 添加kubernetes和docker的yum源
cd  /etc/yum.repos.d/

vi kubernetes.repo
----------------------------------------------------------------------------

[kubernetes]

name=Kubernetes repo

baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/

gpgcheck=0

gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg

enabled=1

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • 安装docker  kubelet  kubeadm  kubelectl
yum install docker kubelet kubeadm kubectl  ##每个节点都需要安装
  • 开启docker
配置国内镜像
vi /etc/docker/daemon.json 
{
"registry-mirrors": ["https://dlbpv56y.mirror.aliyuncs.com"]
}

systemctl enable docker

systemctl start  docker
  • 开启kublet
systemctl enable kubelet

systemctl start kubelet

4、启动kubernetes集群

  4.1 kubeadm init

  通过kubeadm init [flags]命令可以启动一个master节点

kubeadm init \
--apiserver-advertise-address=192.168.10.11 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.16.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

请耐心等1-2分钟直到结束


补充:
kubernetes-version 后面的值通过  kubelet --version 查看

参数介绍:

  • –apiserver-bind-port int32 Default: 6443 可以通过这个参数指定API-server的工作端口,默认是6443。
  • –config string 可以通过这个命令传入kubeadm的配置文件,需要注意的是,这个参数是实验性质的,不推荐使用。
  • –dry-run 带了这个参数后,运行命令将会把kubeadm做的事情输出到标准输出,但是不会实际部署任何东西。强烈推荐!
    -h, --help 输出帮助文档。
  • –node-name string 指定当前节点的名称。
  • –pod-network-cidr string 通过这个值来设定pod网络的IP地址网段;设置了这个值以后,控制平面会自动给每个节点设置CIDRs(无类别域间路由,Classless Inter-Domain Routing)。
  • –service-cidr string Default: “10.96.0.0/12” 设置service的CIDRs,默认为 10.96.0.0/12。
  • –service-dns-domain string Default: “cluster.local” 设置域名称后缀,默认为cluster.local。
  • 其他参数。

 运行结果:

kubeadm-init的工作流

在运行了 kubeadm init 命令以后,都进行了那些操作呢?这里主要就是跟着官方文档来翻译一遍了:

  1. 首先会运行一系列预检代码来检查系统的状态;大部分的检查只会抛出一个警告,也有一部分会抛出异常错误从而导致工作流推出(比如没有关闭swap或者没有安装docker)。官方给出一个参数–ignore-preflight-errors=, 我估计八成大家用不到,除非真的明白自己在做啥。。。
  2. 生成一个用来认证k8s组件间调用的自签名的CA(Certificate Authority,证书授权);这个证书也可以通过–cert-dir(默认是/etc/kubernetets/pki)的方式传入,那么这一步就会跳过。
  3. 把kubelet、controller-manager和scheduler等组件的配置文件写到/etc/kubernets/目录,这几个组件会使用这些配置文件来连接API-server的服务;除了上面几个配置文件,还会生成一个管理相关的admin.conf文件。
  4. 如果参数中包含–feature-gates=DynamicKubeletConfig,会把kubelet的初始化配置文件写入/var/lib/kubelet/config/init/kubelet这个文件;官方给出一坨文字解释,这里先不探究了,因为我没有用到。。。
  5. 接下来就是创建一些 静态pod 的配置文件了,包括API-server、controller-manager和scheduler。假如没有提供外部etcd,还会另外生成一个etcd的静态Pod配置文件。这些静态pod会被写入/etc/kubernetes/manifests,kubelet进程会监控这个目录,从而创建相关的pod。
  6. 假如第五步比较顺利,这个时候k8s的控制面进程(api-server、controller-manager、scheduler)就全都起来了。
  7. 如果传入了参数–feature-gates=DynamicKubeletConfig,又会对kubelet进行一坨操作,因为没有用到,所以这里不做详细探究。
  8. 给当前的节点(Master节点)打label和taints,从而防止其他的负载在这个节点运行。
  9. 生成token,其他节点如果想加入当前节点(Master)所在的k8s集群,会用到这个token。
  10. 进行一些允许节点以 Bootstrap Tokens) 和 TLS bootstrapping 方式加入集群的必要的操作:
  • 设置RBAC规则,同时创建一个用于节点加入集群的ConfigMap(包含了加入集群需要的所有信息)。
  • 让Bootstrap Tokens可以访问CSR签名的API。
  • 给新的CSR请求配置自动认证机制。
  1. 通过API-server安装DNS服务器(1.11版本后默认为CoreDNS,早期版本默认为kube-dns)和kube-proxy插件。这里需要注意的是,DNS服务器只有在安装了CNI(flannel或calico)之后才会真正部署,否则会处于挂起(pending)状态。
    到这里基本上就告一段落了

根据上面的输出提示继续:

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

 

  4.2 node节点加入集群

在两个 Node 节点执行

使用kubeadm join 注册Node节点到Matser

kubeadm join 的内容,在上面kubeadm init 已经生成好了

kubeadm join 192.168.10.11:6443 --token yhns57.4s3y2yll21ew8mta \
    --discovery-token-ca-cert-hash sha256:eeebf579f925b9a64b2fe1fde820bb1707496d8dbe6718759b93cb951c3fc651

注意:这个token24小时后会失效,如果后面有其他节点要加入的话,处理方法:

kubeadm token create
[root@k8s-master ~]# kubeadm token create
0w3a92.ijgba9ia0e3scicg



[root@k8s-master ~]# kubeadm token list
TOKEN                     TTL       EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
0w3a92.ijgba9ia0e3scicg   23h       2019-09-08T22:02:40+08:00   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
t0ehj8.k4ef3gq0icr3etl0   22h       2019-09-08T20:58:34+08:00   authentication,signing   The default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token


[root@k8s-master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
ce07a7f5b259961884c55e3ff8784b1eda6f8b5931e6fa2ab0b30b6a4234c09a

然后加入集群
kubeadm join 192.168.10.11:6443 --token yhns57.4s3y2yll21ew8mta \
    --discovery-token-ca-cert-hash sha256:ce07a7f5b259961884c55e3ff8784b1eda6f8b5931e6fa2ab0b30b6a4234c09a

master节点上查看:

[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES    AGE     VERSION
master   NotReady   master   17m     v1.16.0
node1    NotReady   <none>   3m31s   v1.16.0
node2    NotReady   <none>   119s    v1.16.0
[root@master ~]# kubectl get pods --all-namespaces
NAMESPACE     NAME                             READY   STATUS    RESTARTS   AGE
kube-system   coredns-58cc8c89f4-5jk25         0/1     Pending   0          23m
kube-system   coredns-58cc8c89f4-j97m8         0/1     Pending   0          23m
kube-system   etcd-master                      1/1     Running   0          22m
kube-system   kube-apiserver-master            1/1     Running   0          22m
kube-system   kube-controller-manager-master   1/1     Running   0          22m
kube-system   kube-proxy-85djp                 1/1     Running   0          23m
kube-system   kube-proxy-gggd7                 1/1     Running   0          9m30s
kube-system   kube-proxy-lprnf                 1/1     Running   0          7m58s
kube-system   kube-scheduler-master            1/1     Running   0          22m

至此完成了Master节点上k8s软件的安装,但集群内还没有可用的工作Node,也缺少容器网络的配置。

查看pods状态信息,可以看到还有一个dns的pod处于Pending状态,这是受缺少容器网络支持的影响而造成的。

查看nodes状态信息,看到node节点的状态为NotReady 

 

 

5、安装网络插件

接着安装网络插件我们选择weave(感觉更方便),也可选择flannel

再master上运行:

 kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

这是再检查看一下,发现nodes和pods全是在运行状态了

[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   43m   v1.16.0
node1    Ready    <none>   29m   v1.16.0
node2    Ready    <none>   27m   v1.16.0



[root@master ~]#  kubectl get pods --all-namespaces
NAMESPACE     NAME                             READY   STATUS    RESTARTS   AGE
kube-system   coredns-58cc8c89f4-5jk25         1/1     Running   0          41m
kube-system   coredns-58cc8c89f4-j97m8         1/1     Running   0          41m
kube-system   etcd-master                      1/1     Running   0          41m
kube-system   kube-apiserver-master            1/1     Running   0          40m
kube-system   kube-controller-manager-master   1/1     Running   0          41m
kube-system   kube-proxy-85djp                 1/1     Running   0          41m
kube-system   kube-proxy-gggd7                 1/1     Running   0          28m
kube-system   kube-proxy-lprnf                 1/1     Running   0          26m
kube-system   kube-scheduler-master            1/1     Running   0          41m
kube-system   weave-net-h2x7w                  2/2     Running   0          2m59s
kube-system   weave-net-jmqdd                  2/2     Running   0          2m59s
kube-system   weave-net-w2frw                  2/2     Running   0          2m59s

 查看weave状态

[root@master ~]#  kubectl exec -n kube-system weave-net-h2x7w -c weave -- /home/weave/weave --local status

        Version: 2.5.2 (up to date; next check at 2019/10/09 14:32:36)

        Service: router
       Protocol: weave 1..2
           Name: 5a:8f:40:d9:92:59(node2)
     Encryption: disabled
  PeerDiscovery: enabled
        Targets: 3
    Connections: 3 (2 established, 1 failed)
          Peers: 3 (with 6 established connections)
 TrustedSubnets: none

        Service: ipam
         Status: ready
          Range: 10.32.0.0/12
  DefaultSubnet: 10.32.0.0/12

 

6、测试Kubernetes集群

[root@master ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created

[root@master ~]#  kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposedservice/nginx exposed

[root@master ~]#  kubectl get pods,svc
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-86c57db685-gbs8f   1/1     Running   0          2m28s

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        147m
service/nginx        NodePort    10.99.194.238   <none>        80:30560/TCP   26s

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值