k8s单主机多节点部署笔记

168 阅读7分钟
预备环境:

主机:
    2核2g50g,ip:192.168.192.100

节点:
    2核2g50g,ip:192.168.192.101

一、环境安装

1.1、安装主机(这里是主机,节点机器注意配置地址、主机名不能和主机一致)

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

1.2、进行配置(软件选择)

image.png

1.3、配置网络和主机名

image.png

image.png

image.png

image.png

image.png

image.png

注意:通过以下方法查看网段

image.png

二、环境初始化

注:所有机器都要执行操作

2.1、初始化

2.1.1、检查版本

cat /etc/redhat-release

注:centos版本7.5以上,避免出错

image.png

2.1.2、主机名解析

方便集群中节点相互调用

编辑hosts文件,进行解析

image.png

成功之后,就能ping到其他节点了

image.png

2.1.3、时间同步

需要所有机器时间一致

systemctl start chronyd 设置时间
systemctl enable chronyd 开机自启
date 查看当前时间

image.png

2.1.4、关闭系统的iptables和firewalld规则

在使用k8s和docker的过程中会产生很多iptables规则,为了避免跟系统规则混淆,直接关闭系统的规则

关闭firewalld规则
systemctl stop firewalld
systemctl disable firewalld

关闭iptables规则
systemctl stop iptables
systemctl disable iptables

image.png

2.1.5、禁用selinux

selinux是linux系统下的一个安全服务,如果不关闭,在安装集群中可能会产生各种奇葩问题

编辑 /etc/selinux/config 文件,修改SELINUX的值为disabled
注:修改完毕后要重启linux服务

image.png

2.1.6、禁用swap分区

编辑文件 /etc/fstab,注释掉swap分区一行
# /dev/mapper/centos-swap swap

image.png

2.1.7、修改linux的内核参数

#创建文件/etc/sysctl.d/kubernetes.conf,添加如下配置
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4_forward = 1

image.png

重新加载配置

#重新加载配置
sysctl -p

#加载网桥过滤模块
modprobe br_netfilter

#检查是否加载成功
lsmod | grep br_netfilter

image.png

2.1.8、配置ipvs功能

在kubernetes中service有两种代理,一种是基于iptables,一种是基于ipvs,如果使用ipvs的话,需要手动载入ipvs模块

# 1、安装ipset和ipvsadm
yum install inset ipvsadmin -y

# 2 添加需要加载的模块写入脚本文件
cat <<EOF> /etc/sysconfig/modules/ipvs.modules
#! /bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

# 3 为脚步添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules

# 4 执行脚本文件
/bin/bash /etc/sysconfig/modules/ipvs.modules

# 5 查看对应模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4

image.png

2.1.9、重启服务器

reboot

image.png

2.2、安装docker

2.2.1、切换镜像源

#切换镜像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

2.2.2、查看当前镜像源支持的docker版本

#查看当前镜像源支持的docker版本
yum list docker-ce --showduplicates

2.2.3、安装docker-ce

#这里以docker-ce-18.06.3.ce-3.e17版本为例,注意需要指定 --setopt=obsoletes=0,否则会自动更新最高版本
yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y

2.2.4、添加配置文件

#Docker在默认情况下使用Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来替代cgroupfs

#创建文件夹
mkdir /etc/docker

#添加配置
cat <<EOF> /etc/docker/daemon.json
{
    "exec-opts":["native.cgroupdriver=systemd"],
    "registry-mirrors":["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF

#查看是否配置成功
more /etc/docker/daemon.json

2.2.5、启动docker

#启动docker
systemctl restart docker
#开机自启动
systemctl enable docker 

2.3、安装kubernetes组件

2.3.1、切换镜像源

#由于k8s的镜像源是在国外,速度比较慢,这里切换国内的镜像源
#编辑/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

image.png

2.3.2、安装kubeadm、kubelet和kubectl

yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y

2.3.3、配置kubelet的cgroup

#编辑/etc/sysconfig/kubelet,添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

2.3.4、设置kubelet开机自启

systemctl enable kubelet

2.4、准备集群镜像

2.4.1、查看所需镜像

安装集群之前,提前准备好需要的镜像
kubeadm config images list

2.4.2、下载镜像

此镜像在kubernetes的仓库中,由于网络原因可能无法连接,使用下面方法替代

#定义下载列表
IMAGES=(
kube-apiserver:v1.17.4
kube-controller-manager:v1.17.4
kube-scheduler:v1.17.4
kube-proxy:v1.17.4
pause:3.1
etcd:3.4.3-0
coredns:1.6.5
)

image.png

#遍历循环下载,修改下载源是国内镜像,下载后下载源改回来,因为后期下载东西,都是在k8s源中下载的,这里修改下载源主要是为了加快下载速度

for iname in ${IMAGES[@]};do
docker pull registry.aliyuncs.com/google_containers/$iname
docker tag registry.aliyuncs.com/google_containers/$iname k8s.gcr.io/$iname
docker rmi registry.aliyuncs.com/google_containers/$iname
done

2.5、集群初始化

2.5.1、集群初始化

注:集群初始化,只需要在master中执行

#创建集群
kubeadm init \
--kubernetes-version v1.17.4 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=192.168.192.100

注意:192.168.192.100是主机的ip

image.png

集群创建成功后,有提示创建文件,复制粘贴就行了

image.png

2.5.2、节点加入集群

注:加入集群,只需要在node中执行master中提示的,就能将子节点加入到集群中

kubeadm join 192.168.192.100:6443 --token esuo6y.3e1fsds8hcv51yej \
--discovery-token-ca-cert-hash sha256:b9f37f61746d605b7101b7f367a49f895225ca8259238192de12785a8bdeef86

注:上面的代码,是主机搭建集群后给的

image.png

加入前后的效果:

image.png

2.6、安装网络插件

kubernetes支持多种网络插件,如flannel、calico、canal等等,这里选择flannel

image.png

注:这里的操作只需要在master节点执行就可,插件使用的是DaemonSet的控制器,他会在每个节点都运行

2.6.1、获取fannel配置文件

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation.kube-flannel.yml

2.6.2、修改文件中quay.io仓库为quay-mirror.qiniu.com(应该可以不用改,改了之后notready)

上面步骤,如果下载不了,直接用 
https://github.com/flannel-io/flannel/blob/master/Documentation/kube-flannel.yml

2.6.3、使用配置文件启动fannel

kubectl apply -f kube-flannel.yml

2.6.4查看集群节点状态

kubectl get nodes

注:变为ready需要时间,稍等片刻,如果没有的话,
下载 https://github.com/containernetworking/plugins/releases/download/v0.8.6/cni-plugins-linux-amd64-v0.8.6.tgz ,上传到服务器中,将flannel拷贝到/opt/cni/bin目录下即可

2.7 服务部署

这里部署一个nginx服务,只需要在主机部署就行了

2.7.1、部署

kubectl create deployment nginx --image=nginx:1.14-alpine

2.7.2、暴露端口

kubectl expose deployment nginx --port=80 --type=NodePort

2.7.3、查看pod、service

kubectl get pod
kubectl get service

image.png

集群的节点可以通过 主机ip + 32173端口 ,访问到nginx

3、资源管理

3.1、资源管理方式

3.1.1 命令式对象管理:直接使用命令去操作kubernetes资源

kubectl [command][type] [name] [flags]

command:指定要对资源进行的操作,如create、get、delete

type:指定资源类型,比如deployment、pod、service

name:指定资源的名称,名称大小写敏感

flags:指定额外的可选参数

#查看所有pod
kubectl get pod

#查看某个pod
kubectl get pod pod_name

#查看某个pod,以yaml格式展示结果
kubectl get pod pod_name -o yaml

可以通过kubectl --help 获取各种操作信息

创建一个名为dev的namespace,在dev中创建pod,默认是在default

kubectl create ns dev
kubectl get ns
kubectl run pod --image=nginx -n dev
#查看已经创建的pod
kubectl get pods -n dev
#查看该pod的状态
kubectl describe pod pod-864f9875b9-hfvxk -n dev
#删除该pod,用的run命令,删除后会自动创建一个,直接删除dev就能把里面全部删除
kubectl delete pod pod-864f9875b9-hfvxk -n dev
#删除整个dev
kubectl delete ns dev

3.1.2 命令式对象配置:通过命令配置和配置文件去操作kubernetes资源

kubectl create/patch -f nginx-pod.yaml

通过命令加上配置文件操作资源

(1)、创建一个nginxpod.yaml,内容如下:

apiVersion: v1
kind: Namespace
metadata:
    name: dev
    
---

apiVersion: v1
kind: Pod
metadata:
    name: nginxpod
    namespace: dev
spec:
    containers:
    - name: nginx-containers
      image: nginx:1.17.1

(2)、执行create命令,创建资源

kubectl create -f nginxpod.yaml

(3)、查看资源

kubectl get pod -n dev

(4)、删除资源

#这里删除资源,可以直接通过配置文件删除
kubectl delete -f nginxpod.yaml

3.1.3 声明式对象配置:通过apply命令和配置文件去操作kubernetes资源

kubectl apply -f nginx-pod.yaml

声明式对象配置跟命令式对象配置很相似,但是只有一个命令apply(该方法只用于创建和更新)

(1)、执行一次kubectl apply -f yaml,创建资源

kubectl apply -f nginxpod.yaml

(2)、再次执行一次kubectl apply -f yaml文件,发现资源没有变动

因为yaml文件没有改变东西,所以不会更新

2.7.4、node节点使用kubectl

在master节点中执行 scp -r HOME/.kube node1:HOME/

3、实战

3.1、Namespace

Namespace是Kubernetes系统中一种非常重要的资源,主要作用是用来实现多套环境资源的隔离或者多租户的资源隔离。默认情况下,kubernetes集群中所有的pod是可以相互访问的,但是实际中可能不想让两个pod之间相互访问,因此就需要将两个pod划分到不同的namespace下,形成逻辑上的组。

3.2、Pod

通过控制pod控制器,来控制pod

#创建pod
kubectl run nginx --image=nginx:1.14-alpine --port=80 --namespace dev
#查看描述
kubectl describe pod pod_name
#删除pod
kubectl delete deployment pod_name -n dev

通过yaml文件来控制

#创建
kubectl create -f pod-nginx.yaml
#删除
kubectl delete -f pod-nginx.yaml

3.3、Label

在资源上进行标签,用来区分标识

#打标签
kubectl label pod nginx -n dev version=1.0
#更新标签
kubectl label pod nginx -n dev version=1.0 --overwrite
#删除标签
kubectl label pod nginx -n dev version-

3.4、Deployment

3.5、Service