资讯专栏INFORMATION COLUMN

循序渐进的手动安装k8s笔记-2

pingink / 2683人阅读

摘要:启动并设置为开机自启动安装服务这部分配置与上一篇笔记完全相同。我们创建这个文件并填入如下内容安装完和之后将其启动并设置为开机自启动以上,角色的功能已经安装完成。

上一篇笔记中,我尝试了使用 k8s 1.6 版本安装一个最简单的集群。这一次,我希望能够增加 node 的数量并且安装网络插件,然后配置内部的域名解析功能。

在起初的设想中,我仍然希望不配置各个组件间的认证,只关心功能的正常运行。但在配置的过程中发现 pod 中运行的组件如果要和 kube-apiserver 通信的话,必须要有相关的认证信息,要么使用 ServiceAccount ,要么配置 kubeconfig 。那么在仍然希望安装所进行的配置最少的情况下,我选择在 kube-apiserver 和 kube-controller-manager 之间配置 CA 和一组服务端证书,来支持 ServiceAccount 的正常使用。

参考资料:

《Kubernetes权威指南》

Kubernetes Flannel网络部署

为CentOS 7.2中的Kuberbetes集群搭建Dashboard

kubernetes:kubedns安装

运行环境&软件版本:

Ubuntu 16.04.4 LTS

kubernetes v1.6.0

etcd v3.0.14

docker-ce 18.06.1-ce

flannel v0.10.0

k8s-dns 1.14.1

easyrsa3

角色规划
主机名 IP地址 角色 CPU/内存
u16-1 192.168.112.148 master 2核/2G
u16-2 192.168.112.149 node 2核/2G
u16-3 192.168.112.150 node 2核/2G

另外预先规定 clusterIP 使用的网段 10.244.0.0/16,kube-dns 的 service 使用的 IP 为 10.244.0.10

环境准备

首先仍然是下载 kubernetes 1.6.0 和 对应版本的 etcd,并上传到服务器。

关闭 swap并在 /etc/fstab 文件中取消掉自动挂载

sudo swapoff -a
# vim /etc/fstab 或者其他方式

如果系统上安装了SELinux,需要将其关闭。另外还需要在防火墙上放开下面步骤中所有需要使用的端口,或者关闭防火墙管理软件,我这里选择将ubuntu16.04默认的ufw关闭

sudo ufw disable

安装 docker-ce ,这里我选择添加阿里云的源并使用 apt-get 安装:

# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce

为了能够使集群节点之间、集群内外能够通信,需要在 docker 的服务文件 /lib/systemd/system/docker.service 的 [Service] 段中添加下面内容,含义为在启动 docker 之后,修改 FORWARD 链的默认规则为 ACCEPT。

ExecStartPost=/sbin/iptables -P FORWARD ACCEPT

在 /etc/hosts 中配置各个节点的解析,如果这里不配置节点之间可能无法通过 node 的 name 互相找到。

# 添加如下几行
192.168.112.148    u16-1
192.168.112.149 u16-2
192.168.112.150 u16-3
安装 Master 功能 安装 etcd 服务
tar xf etcd-v3.0.14-linux-amd64.tar.gz
# 把解压后的 etcd 和 etcdctl 复制到 /usr/bin 目录下
sudo cp etcd-v3.0.14-linux-amd64/etcd{,ctl} /usr/bin/
# 创建 etcd 工作路径和配置存放路径
sudo mkdir /var/lib/etcd/
sudo mkdir /etc/etcd/
# 然后创建管理脚本 /lib/systemd/system/etcd.service 和配置文件 /etc/etcd/etcd.conf。内容如下
cat /lib/systemd/system/etcd.service 
[Unit]
Description=Etcd Server
After=network.target
[Service]
Type=notify
WorkingDirectory=/var/lib/etcd/
EnvironmentFile=-/etc/etcd/etcd.conf
ExecStart=/usr/bin/etcd $ETCD_ARGS
[Install]
WantedBy=multi-user.target

cat /etc/etcd/etcd.conf 
ETCD_ARGS="--listen-client-urls "http://192.168.112.148:2379" --advertise-client-urls "http://192.168.112.148:2379""

# 启动并设置为开机自启动
sudo systemctl daemon-reload
sudo systemctl start etcd
sudo systemctl enable etcd
# 完成后可以检查一下服务是否正常运行
systemctl status etcd
# 也可以使用 etcdctl 来检查 etcd 健康状况
etcdctl --endpoints http://192.168.112.148:2379 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://192.168.112.148:2379
cluster is healthy

这里并没有像上一篇笔记中那样使用默认配置让 etcd 只监听本地回环的 2379 端口,因为现在除了 kube-apiserver 之外各个 node 上运行 flanneld 也需要使用 etcd ,所以选择监听了本机IP的 2379 端口。

参数说明:  
--listen-client-urls 指定要监听客户端流量的URL列表,也就是对客户端开放的地址和端口。
--advertise-client-urls 指定向客户端告知的URL列表。
安装 kube-apiserver 服务
tar xf kubernetes-server-linux-amd64.tar.gz
# 将 kube-apiserver、kube-controller-manager 和 kube-scheduler 的二进制文件复制到 /usr/bin 目录下
sudo cp kubernetes/server/bin/kube-{apiserver,controller-manager,scheduler} /usr/bin/
# 顺带把 kubectl 也放在系统 PATH 中
sudo cp kubernetes/server/bin/kubectl /usr/bin
# 创建日志存放目录和配置存放目录
sudo mkdir /var/log/kubernetes
sudo mkdir /etc/kubernetes

下面需要创建 apiserver 与 controller-manager 之间认证所需要的证书。

# 这里我准备使用 easy-rsa 工具生成证书。先下载 easy-rsa
curl -L -O https://storage.googleapis.com/kubernetes-release/easy-rsa/easy-rsa.tar.gz
tar xf easy-rsa.tar.gz
cd easy-rsa-master/easyrsa3/
# 初始化工具
./easyrsa init-pki
# 创建根证书(CA)
./easyrsa --batch "--req-cn=192.168.112.148@`date +%s`" build-ca nopass
# 创建服务端证书和秘钥,这里的 IP 一个是 master 所在 host 的 IP,另一个是 apiserver 的 clusterIP
./easyrsa --subject-alt-name="IP:192.168.112.148,IP:10.244.0.1" build-server-full server nopass
# 创建证书存放目录并把需要的证书及秘钥复制
sudo mkdir /etc/kubernetes/pki
sudo cp pki/ca.crt pki/issued/server.crt pki/private/server.key /etc/kubernetes/pki

然后创建管理脚本 /lib/systemd/system/kube-apiserver.service 和配置文件 /etc/kubernetes/apiserver

cat /lib/systemd/system/kube-apiserver.service 
[Unit]
Description=Kubernetes API Server
After=etcd.service
Wants=etcd.service
[Service]
EnvironmentFile=/etc/kubernetes/apiserver
ExecStart=/usr/bin/kube-apiserver $KUBE_API_ARGS
Restart=on-failure
Type=notify
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target

cat /etc/kubernetes/apiserver 
KUBE_API_ARGS="--storage-backend=etcd3 
--etcd-servers=http://192.168.112.148:2379 
--insecure-bind-address=0.0.0.0 
--insecure-port=8080 
--service-cluster-ip-range=10.244.0.0/16 
--service-node-port-range=1-65535 
--admission_control=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota 
--client-ca-file=/etc/kubernetes/pki/ca.crt 
--tls-cert-file=/etc/kubernetes/pki/server.crt 
--tls-private-key-file=/etc/kubernetes/pki/server.key 
--logtostderr=false 
--log-dir=/var/log/kubernetes 
--v=2"

# 启动并设置为开机自启动
sudo systemctl daemon-reload
sudo systemctl start kube-apiserver
sudo systemctl enable kube-apiserver
kube-apiserver 的参数说明:  
--service-cluster-ip-range :指定集群 Cluster IP 网段。因为希望使用 10.244.0.0/16 作为使用的网段,所以在这里指定。
--admission_control :Kubernetes 集群的准入控制设置,各控制模块以插件形式依次生效。因为 pod 中运行的插件需要使用 serviceaccount ,所以这次不删除 ServiceAccount 模块。
--client-ca-file :指定CA根证书文件
--tls-cert-file :指定服务端证书文件
--tls-private-key-file :指定服务端私钥文件
安装 kube-controller-manager 服务

上一步已经将需要的二进制可执行文件和证书秘钥放在相应的位置了,下面需要创建管理脚本 /lib/systemd/system/kube-controller-manager.service 和 配置文件 /etc/kubernetes/controller-manager

cat /lib/systemd/system/kube-controller-manager.service 
[Unit]
Description=Kubernetes Controller Manager
After=kube-apiserver.service
Requires=kube-apiserver.service
[Service]
EnvironmentFile=/etc/kubernetes/controller-manager
ExecStart=/usr/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_ARGS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target

cat /etc/kubernetes/controller-manager 
KUBE_CONTROLLER_MANAGER_ARGS="--master=http://192.168.112.148:8080 
--service-account-private-key-file=/etc/kubernetes/pki/server.key 
--root-ca-file=/etc/kubernetes/pki/ca.crt 
--logtostderr=false 
--log-dir=/var/log/kubernetes 
--v=2"
kube-controller-manager 参数说明:  
--service-account-private-key-file :指定服务端私钥。用于签署 serviceaccount 的 token。
--root-ca-file :指定 ca 跟证书文件。配置了此项后,ca证书将被包含在 serviceaccount 中,然后就可以使用 serviceaccount 认证 组件与apiserver 间的通讯。

启动并设置为开机自启动

sudo systemctl daemon-reload
sudo systemctl start kube-controller-manager
sudo systemctl enable kube-controller-manager
安装 kube-scheduler 服务

这部分配置与上一篇笔记完全相同。编辑 systemd 服务文件 /lib/systemd/system/kube-scheduler.service

[Unit]
Description=Kubernetes Scheduler Server
After=kube-apiserver.service
Requires=kube-apiserver.service

[Service]
EnvironmentFile=/etc/kubernetes/scheduler
ExecStart=/usr/bin/kube-scheduler $KUBE_SCHEDULER_ARGS
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

环境变量文件 /etc/kubernetes/scheduler 中定义了 kube-scheduler 启动参数 KUBE_SCHEDULER_ARGS。我们创建这个文件并填入如下内容

KUBE_SCHEDULER_ARGS="--master=http://192.168.112.148:8080 
--logtostderr=false 
--log-dir=/var/log/kubernetes 
--v=2"

安装完 kube-controller-manager 和 kube-scheduler 之后将其启动并设置为开机自启动

sudo systemctl daemon-reload
sudo systemctl start kube-scheduler
sudo systemctl enable kube-scheduler

以上,master 角色的功能已经安装完成。下面需要在所有的节点安装 node 角色的功能。

安装 node 功能

安装 kubelet 和 kube-proxy 的过程与上篇笔记基本相同。

安装 kubelet 和 kube-proxy
tar xf kubernetes-server-linux-amd64.tar.gz
# 将 kubelet 和 kube-proxy 的二进制文件复制到 /usr/bin 目录下
sudo cp kubernetes/server/bin/kube{let,-proxy} /usr/bin/
# 创建 kubelet 的工作路径 /var/lib/kubelet 、配置文件的存放路径 /etc/kubernetes 和 日志路径 /var/log/kubernetes。master 节点上已经创建过的文件夹则不需要再次创建
sudo mkdir /var/lib/kubelet
sudo mkdir /var/log/kubernetes
sudo mkdir /etc/kubernetes
# 下一步分别创建 kubelet 和 kube-proxy 的管理脚本与配置文件,内容如下
cat /lib/systemd/system/kubelet.service 
[Unit]
Description=Kubernetes Kubelet Server
After=docker.service
Requires=docker.service
[Service]
WorkingDirectory=/var/lib/kubelet
EnvironmentFile=/etc/kubernetes/kubelet
ExecStart=/usr/bin/kubelet $KUBELET_ARGS
Restart=on-failure
[Install]
WantedBy=mulit-user.targe

cat /lib/systemd/system/kube-proxy.service 
[Unit]
Description=Kubernetes Kube-Proxy Server
After=networking.service
Requires=networking.service
[Service]
EnvironmentFile=/etc/kubernetes/proxy
ExecStart=/usr/bin/kube-proxy $KUBE_PROXY_ARGS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target

cat /etc/kubernetes/kubelet 
KUBELET_ARGS="--api-servers=http://192.168.112.148:8080 
--hostname-override=u16-1 
--cgroups-per-qos=false 
--enforce-node-allocatable="" 
--logtostderr=false 
--log-dir=/var/log/kubernetes 
--v=2"

cat /etc/kubernetes/proxy 
KUBE_PROXY_ARGS="--master=http://192.168.112.148:8080 --logtostderr=false --log-dir=/var/log/kubernetes --v=2"

# 将这两个服务启动并设置为开机自动启动
sudo systemctl start kubelet kube-proxy && sudo systemctl enable kubelet kube-proxy
--hostname-override ,设置本节点显示的名字,需要与/etc/hosts 中的解析对应
安装 flanneld 网络插件

wget 下载 flannel 对应版本的二进制程序包,也可以在 github 上下载。

wget https://github.com/coreos/flannel/releases/download/v0.10.0/flannel-v0.10.0-linux-amd64.tar.gz
# 解压出需要的程序放在 /usr/bin 下
tar xf flannel-v0.10.0-linux-amd64.tar.gz
sudo cp flanneld /usr/bin/
sudo cp mk-docker-opts.sh /usr/bin/

创建 systemd 管理脚本 /lib/systemd/system/flanneld.service。内容如下:

cat /lib/systemd/system/flanneld.service 
[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
Before=docker.service
[Service]
EnvironmentFile=-/etc/kubernetes/flanneld
ExecStart=/usr/bin/flanneld  ${FLANNEL_ETCD} ${FLANNEL_OPTIONS}
ExecStartPost=/usr/bin/mk-docker-opts.sh -d /run/flannel/docker
Type=notify
[Install]
WantedBy=multi-user.target
RequiredBy=docker.service

创建 flanneld 的配置文件:

cat /etc/kubernetes/flanneld 
FLANNEL_ETCD="-etcd-endpoints=http://192.168.112.148:2379"
FLANNEL_ETCD_KEY="/coreos.com/network"

同时还需要修改 /lib/systemd/system/docker.service 。在 After= 和 Requires= 后添加 flanneld.service 。添加环境变量文件 EnvironmentFile=-/run/flannel/docker ,同时在 ExecStart= 后面添加环境变量 DOCKER_OPTS , 比如:ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS

flannel 网络插件使用 etcd 存储和同步信息,在启动 flanneld 之前首先在 etcd 中设置初始的配置:

etcdctl --endpoints http://192.168.112.148:2379 set /coreos.com/network/config "{ "Network": "10.244.0.0/16" }"

然后就可以启动 flanneld 了

sudo systemclt daemon-reload
sudo systemctl start flanneld && sudo systemctl enable flanneld
# 启动 flanneld 之后还需要重启 docker 和 kubelet
sudo systemctl restart docker kubelet
# 之后查看本机网卡信息,docker0 的 ip 地址已经变为指定的 ip 段。

下面我们可以创建几个 在不用 node 上运行的 pod 来测试网络是否已经联通。

# 还是先解决基础镜像的问题 
sudo docker image pull mirrorgooglecontainers/pause-amd64:3.0
sudo docker tag mirrorgooglecontainers/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0
# 然后创建一个 yaml 文件用于配置测试用的资源
cat test.yml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
---
apiVersion: v1
kind: Pod
metadata:
  name: client
spec:
  restartPolicy: OnFailure
  containers:
  - name: curl
    image: appropriate/curl
    args:
    - /bin/sh
    - -c
    - sleep 6000

# 创建资源
kubectl apply -f test.yml 
kubectl get pod -o wide
# 检查 NODE 列,因为要测试不同 node 上是否可以互相通信,所以希望这里2个 pod 不在一个 node 上。
NAME                     READY     STATUS    RESTARTS   AGE       IP            NODE
client                   1/1       Running   0          2m        10.244.62.2   u16-1
nginx-3406752312-7z5fs   1/1       Running   0          2m        10.244.18.2   u16-2
# 之后进入 client pod 的 容器内测试连接 nginx POD 的服务,看是否能够正常访问。
kubectl exec -it client /bin/sh
# 下面为在容器内操作
curl 10.244.18.2
# 显示访问正常



Welcome to nginx!
…………
安装插件

我在这里只尝试安装了 kube-dns 插件,希望达到的目标是 k8s 内的容器在创建时都会指定 kube-dns 插件的地址为 dns 服务器,并且这个 dns 可以解析集群创建的 service 的地址。

kube-dns 的安装是将 kube-dns 作为一个 deployment 部署,它的 yaml 文件在 k8s 源码包内。

# 源码包已经包含在我们下载的二进制安装包内了,先解压
cd kubernetes/
tar xf kubernetes-src.tar.gz
cd cluster/addons/dns
# 将需要修改的文件复制一份并作出修改,将模板改中的变量改为实际的值
cp kubedns-svc.yaml.sed kubedns-svc.yaml
cp kubedns-controller.yaml.sed kubedns-controller.yaml
sed -i "s/$DNS_SERVER_IP/10.244.0.10/g" kubedns-svc.yaml
sed -i "s/$DNS_DOMAIN/cluster.local/g" kubedns-controller.yaml
# 创建 kube-dns 所需要的 configmap、serviceaccount、service和deployment
kubectl apply -f kubedns-cm.yaml
kubectl apply -f kubedns-sa.yaml --namespace=kube-system
# sa 的模板中并没有指定 namespace ,其他模板中指定了,不知道什么原因,但我在这里需要将 serviceaccount 创建在 kube-system 的 namespace 下。
kubectl apply -f kubedns-svc.yaml
kubectl apply -f kubedns-controller.yaml
# 查看 dns 是否正常运行,这里 READY 为 3/3,STATUS 为 Running 表示运行成功
kubectl get pod -n kube-system

安装完成 kube-dns 后,还需要在所有 kubelet 的启动参数中增加下面参数,然后重启 kubelet。

--cluster-dns=10.244.0.10 --cluster-domain=cluster.local

测试一下功能

# 回到刚才的 test.yml 所在的目录,删除掉刚才的资源并重新创建
kubectl delete -f test.yml
kubectl apply -f test.yml
# 再创建文件用于 nginx 的svc 
cat test-svc.yml 
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
# 创建 svc
kubectl apply -f test-svc.yml
# 之后进入 client pod 的容器内测试通过 svc 的名字连接 nginx POD 的服务,看是否能够正常访问。
kubectl exec -it client /bin/sh
# 下面为在容器内操作
curl http://nginx-svc



Welcome to nginx!
…………
# 因为此时新部署的pod都已经自动配置了 kube-dns 作为 dns 服务器。可以查看 /etc/resolv.conf 
cat /etc/resolv.conf 
nameserver 10.244.0.10
search default.svc.cluster.local svc.cluster.local cluster.local localdomain
options ndots:5

至此,一个多 node 间的 pod 可以互相通信,并且可以通过 dns 来访问或者进行服务发现的 k8s 集群已经部署完成。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/32731.html

相关文章

  • 循序渐进手动安装k8s笔记-1

    摘要:日志级别通过启动并设置为开机自启动之后可以通过来检查服务器运行状态安装服务编辑服务文件环境变量文件中定义了启动参数。 不知道有没有人和我一样,在手动安装时因为很多原因没有成功(主要还是知识储备不够),被各种高可用配置和各种证书权限弄得迷迷糊糊。这个笔记是我在尝试了很多种手动安装Kubernetes集群教程中的方法失败后产生的想法,希望能够将复杂的配置化繁为简,呈现出一个基本功能的Kub...

    CoderDock 评论0 收藏0
  • 快收藏!5225万字,微服务、云原生、容器、K8S、Serverless精华文章集锦

    摘要:正在走远,新年之初,小数精选过去一年阅读量居高的技术干货,从容器到微服务云原生,汇集成篇精华集锦,充分反映了这一年的技术热点走向。此文值得收藏,方便随时搜索和查看。,小数将继续陪伴大家,为朋友们奉献更有逼格的技术内容。 2017正在走远,新年之初,小数精选过去一年阅读量居高的技术干货,从容器、K8S 到微服务、云原生、Service Mesh,汇集成52篇精华集锦,充分反映了这一年的技...

    AaronYuan 评论0 收藏0
  • k8s安装总结

    摘要:主要在文件附加下面的源我使用的是阿里的镜像,如果你使用的其他国内镜像,请找对应的镜像源然后执行下列命令,安装软件。参考资料只要用小朋友都能部署基本安装基于阿里云镜像站安装用在上快速构建测试集群 本次安装环境是Ubuntu16.04,其他环境下,shell命令会有一些不同,但步骤应该大致相同,默认docker已经安装完成 下载 下载安装下列软件 kubelet Node上运行的节点代理...

    Nosee 评论0 收藏0
  • 前端学习路线

    摘要:具体来说,包管理器就是可以通过命令行,帮助你把外部库和插件放到你的项目里面并在之后进行版本升级,这样就不用手工复制和更新库。现在有的包管理器主要是和。 一、基础 1、学习HTML基础 HTML给你的网页赋予了结构。它就像是人的骨架那样让你保持站立。首先你需要去学习语法以及它必须提供的一切。你的学习应该聚焦在下面这些东西上: 学习HTML基础,了解如何编写语义HTML 理解如何把网页分...

    FullStackDeveloper 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<