centos7安装kubeadm

centos7安装kubeadm

一、基础设置

1、设置主机名

hostnamectl set-hostname master
hostnamectl set-hostname node01

vim /etc/hosts
192.168.198.169	master
192.168.198.170	note01

hostnamectl

hostnamectl 是在 centos7 中新增加的命令,它是是用来管理给定主机中使用的三种类型的主机名

在CentOS7中有三种定义的主机名:静态的(static)、瞬态的(transient)、和灵活的(pretty)。“static”主机名是可由用户选择的传统 hostname,并保存在 /etc/hostname 文件中。 “transient” hostname 是由内核维护的动态主机名。它最初是默认的 static 主机名,其值默认为 “localhost”。 可由 DHCP 或 mDNS 在运行时更改其默认值。“pretty” hostname 是为用户提供的任意格式 UTF8 主机名

hostnamectl 用法
-h	--help	显示帮助
	--version	显示安装包的版本
	--transient	修改临时主机名
	--static	修改瞬态主机名
	--pretty	修改灵活主机名
-p	--privileged	在执行之前获得的特权
	--no-ask-password	输入密码不提示
-h	--host=[USER@]HOST	设置主机平台类型名

Commands:
	status	显示当前主机名设置
	set-hostname NAME	设置系统主机名
	set-icon-name	NAME	为主机设置icon名
	set-chassis	NAME	设置主机平台类型名
具体用法
hostnamectl status

如果未指定任何选项,则默认使用 status 选项
hostnamectl <==> hostnamectl status
设定所有主机名
hostnamectl set-hostname 主机名

这样会将 pretty 、 static 、 和 transient 主机名变得相似。 Static 和 transient 主机名会简化为 pretty 主机名格式。使用 “-” 替换空格,并删除特殊字符。

过程
# hostname
localhost.localdomain
# hostnamectl set-hostname xsnq
# hostname //查看主机名已近修改成功
xsnq
// 这里远程登录(CRT)重新连接服务器也可以
# init 6	//重启服务器
# // 主机名显示也修改完成
设定/清除特定主机名
hostnamectl set-hostname "" option...
过程
# hostname
xsnq
# hostnamectl set-hostname "" --static
# hostname	// 此时清除成功,但还未生效
xsnq
# init 6	// 重启
# hostname	// 已还原成默认形式
localhost.localdomain

hostname和hostnamectl 区别

hostname 临时修改主机名;
hostnamectl 永久修改主机名,是对 /etc/hostname 文件的内容进行修改

/etc/hosts

主机名查询静态表,是ip地址与域名快速解析的文件。ip地址与主机名之间的映射,包括主机的别名。

通常将常用的域名和ip地址映射加入到hosts文件中,实现快速方便的访问

如果没有域名解析(DNS),操作系统需要查询该文件来解析对应主机名的ip地址;如果有域名解析(DNS),也可以设置该文件,优先级:DNS缓存 > /etc/hosts/ > DNS服务

ssh免登录

ssh-keygen	# node 生成密钥, 一路回车

ssh-copy-id user@host	# master 拷贝密钥

ssh-keygen命令

ssh-keygen 用来生成ssh公钥认证所需的公钥和私钥文件

ssh 密钥登录特点:1、安全;2、免输密码

对于安全级别较高的服务器,建议配好 ssh 登录后禁掉密码登录。

缺点:略繁琐。如果你的只是临时登录一次,那么还是密码吧。

一、生成密钥

秘钥对需要在你自己的机器上生成,然后把公钥放到服务器相应用户的 ~/.ssh 目录

执行下面命令,默认生成位置是 ~/.ssh

ssh-keygen

系统会询问你文件名和秘钥密码,可以一路回车过去,会生成两个文件:

  • id_rsa 私钥
  • id_rsa.pub 公钥

默认使用rsa算法,你也可以用比较详细的指令,如

ssh-keygen -t rsa -b 1024 -f yourkeyname -C "备注"
参数解释
-b采用长度1024 bit 的密钥对,b=bits, 最长 4096,不过没啥必要
-t rsa采用 rsa 加密方式, t=type
-f生成文件名, f=output_keyfiles
-C备注, C=momment

更多参数可运行 man ssh-keygen

ssh-copy-id 命令

ssh-copy-id 命令可以把本地的 ssh 公钥文件安装到远程主机对应的账户下。

达到的功能

ssh-copy-id - 将你的公钥 密钥 填充到一个远程机器上的 authorized_keys 文件中。

使用模式:

ssh-copy-id [-i [identity_file]][user@]machine

描述

ssh-copy-id 是一个实用 ssh 去登陆到远程服务器的脚本(假设使用一个登录密码,因此,密码认证应该被激活直到你已经清理了做 了多个身份的使用)。

​ 它也能够改变远程用户名的权限,~/.ssh 和 ~/.ssh/authorized_keys 删除群组写的权限(在其他方面,如果远程机上的 sshd 在它的位置文件中是严格模式的话,这能够组织你登陆)。

​ 如果这个 “-i” 选项已经给出了,然后这个认证文件(默认是 ~/.ssh/id_rsa.pub)被使用,不管在你的 ssh-agent 那里是 否有任何密钥。另外,命令 “ssh-add -L” 提供任何输出,它使用这个输出优先于身份认证文件。如果给出了 “-i” 选项, 或者 ssh-add 不产生输出, 它使用 ssh 将这些指纹填充到远程机 ~/.ssh/authorized_keys 文件中

ssh-keygen 产生公钥与私钥对。

ssh-copy-id 将本机的公钥复制到远程机器的 authorized_keys 文件中,

ssh-copy-id 也能让你有到远程机器的 home , ~./ssh , 和 ~/.ssh/authorized_keys 的权利

第一步:在本地机器上使用 ssh-keygen 产生公钥私钥对

ssh-keygen

第二步:用 ssh-copy-id 将公钥复制到远程机器中

ssh-copy-id -i ~/.ssh/id_rsa.pub remote-host

第三步:登录到 远程机器不用输入密码

ssh remote-host

常见问题:

ssh-copy-id -u eucalyptus -i ~eucalyptus/.ssh/id_ras.pub eucalyptus@remote_host

上述是给 eucalyptus 用户赋予无密码登录的权利

关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

禁用 SELINUX

# 将 SElinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive' /etc/selinux/config

SELinux是什么?

SELinux 是 Security Enhanced Linux 缩写,采用委任式存取控制,是在进行程序、文件等细节权限设置依据的一个核心模块

SELinux(Security-Enhanced Linux)是 linux 系统中强制访问控制模块,是linux 历史上最杰出的新安全子系统,由 NSA (美国国家安全局)和 linux 社区共同开发出来的,它是一种访问控制体系,在这种访问控制体系下,进程只能访问进程任务中需要的文件。默认安装在 Fedora 和 Red Hat Enterprise Linux 上。也可安装在其他 linux发行版本上。

SELinux 是 2.6 及更高版本的 linux 内核中提供的强制访问控制(MAC)系统。对于目前可用的 linux 安全模块来说, SELinux 是功能最全面,而且测试最充分的,已作为 linux 内核模块, 包含在 linux 内核中。启用该访问模块,进程无法随意访问不包含在任务之中的文件,或路径

存取控制

自主式(DAC)

当程序要操作文件时,系统根据程序 Owner/Group,对比文件的权限,若通过权限检查,则可操作文件,但可能造成问题:

  • root 具有最高权限,若某程序属于 root,则该程序可操作系统的任务文件
  • 使用者可利用程序来变更文件的权限

委任式(MAC)

也即是SELinux所采用的方式,可针对特定程序与特定文件来进行权限控制

  • 即使是 root ,在使用不同程序时所取到的权限也不一定是 root ,而是根据该程序的设定
  • 程序也不能任意使用系统文件,因为每个文件也有针对该程序可用的权限设定

SELinux组成

主要组成部分为 Subject、Object、Policy 和 security context

Subject 即是要管理的程序, Object 即是要操作的文件系统, Policy 为基本的存取安全性策略,分别为

  • targeted:针对网络服务限制较多,针对本机限制较少,是默认政策
  • minimun:由 target 修改而来,仅针对选择的程序来保护
  • mls:完整的权限限制,限制方面较为严格

Subject 与 Object 的 security context 要一致才能顺序存取,其分为3个部分

  • Identity:unconfined_u 表示文件来自不受限制程序产生, system_u 表示文件由系统产生
  • Role:object_r 表示文件, system_r 表示程序或一般使用者, unconfined_r 表示不受限角色
  • Type:在 Subject 则称为 domain, 在 Object 中称为 Type,两者需一致

SELinux 安装

systemctl stop apparmor
apt purge apparmor
apt update && sudo apt upgrade -yuf
apt install policycoreutils selinux-utils selinux-basics

SELinux开关及模式

  • enforcing:强制模式,表示 SELinux 运行中,且正在限制 domain/type
  • permissive:宽容模式,表示SELinux运行中,但仅有警告信息并未限制 domain/type,多用于 debug
  • disabled:关闭

命令 getenforce 可获取 SELinux 的模式,上面安装完后,默认为 disabled

命令 setenforce 设置 SELinux模式,0 为 permissive,1为enforcing,但实际上只能在开机状态下切换 enforcing 和 permissive ,而不能从 disabled 直接切换为 enforcing 或 permissive,反之也不行

故想要打开 SELinux,需通过 vi 将 /etc/selinux/config 的 SELINUX = disabled 改为 permissive 或 enforcing

关闭swap分区

swapoff -a 
sed -i 's/.*swap.*/#&/' /etc/fstab

Linux swap 分区及作用详解

我们在安装系统的时候已经建立了 swap 分区。 swap分区通常被称为交换分区,这是一块特殊的硬盘空间,即当实际内存不够用的时候,操作系统会从内存中取出一部分暂时不用的数据,放在交换区中,从而为当前运行的程序腾出足够的内存空间

允许 iptables 检查桥接流量

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system

放行端口

控制平面节点

协议方向端口范围作用使用者
TCP入站6443Kubernetes API 服务器所有组件
TCP入站2379-2380etcd 服务器客户端 APIkube-apiserver, etcd
TCP入站10250Kubelet APIkubelet 自身、控制平面组件
TCP入站10251kube-schedulerkube-scheduler 自身
TCP入站10252kube-controller-managerkube-controller-manager 自身

工作节点

协议方向端口范围作用使用者
TCP入站10250Kubelet APIkubelet 自身、控制平面组件
TCP入站30000-32767NodePort 服务†所有组件

安装 v-1.17 的 kubeadm/kubelet/kubectl

由于 kubeadm 的官方源在国外,所以如果不科学上网的情况下,直接下载 kubeadm 以及 kuberenets 集群组件镜像(k8s.gcr.io)会非常缓慢,这里我们直接采用阿里云的 kubernetes 镜像库来进行安装。

(1)先配置 kubeadm 的安装源:

CentOS / RHEL / Fedora

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
setenforce 0

查看可安装的 kubeadm 版本:

[root@node13 ~]# yum list kubeadm --showduplicates|sort -r
已加载插件:fastestmirror
已安装的软件包
可安装的软件包
 * updates: mirrors.aliyun.com
Loading mirror speeds from cached hostfile
kubeadm.x86_64                       1.9.9-0                         kubernetes 
kubeadm.x86_64                       1.9.8-0                         kubernetes 
kubeadm.x86_64                       1.9.7-0                         kubernetes 
kubeadm.x86_64                       1.9.6-0                         kubernetes 
kubeadm.x86_64                       1.9.5-0                         kubernetes 
kubeadm.x86_64                       1.9.4-0                         kubernetes 

选择安装 v1.17.17-0 的 kubeadm:

[root@node13 yum.repos.d]# yum install kubelet-1.17.17-0 kubeadm-1.17.17-0 kubectl-1.17.17-0 -y
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
...
kubernetes                                                                                                      | 1.4 kB  00:00:00
...
已安装:
  kubeadm.x86_64 0:1.17.17-0                              kubectl.x86_64 0:1.17.17-0                              kubelet.x86_64 0:1.17.17-0                             

作为依赖被安装:
  kubernetes-cni.x86_64 0:0.8.7-0                                   

完毕!

# 警用swap
[root@node13 ~]# sudo swapoff -a
#设置kubelet开机启动
[root@node13 yum.repos.d]# systemctl enable kubelet && systemctl start kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
#重启docker服务
[root@node13 ~]# systemctl daemon-reload 
[root@node13 ~]# systemctl restart docker

3. 预下载 k8s 集群组件镜像

执行 kubeadm init 执行节点安装 k8s 集群时,最大的问题是在此过程中会去 k8s.gcr.io 的 kubernetes 官方镜像源下载 k8s 组件的镜像,所以我们可以提前预下载所需要的组件镜像:

查看 kubeadm init 时所需要的组件镜像列表:

[root@node13 ~]# kubeadm config images list
I0415 13:20:10.609056    5888 version.go:251] remote version is much newer: v1.21.0; falling back to: stable-1.17
W0415 13:20:11.388040    5888 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0415 13:20:11.388070    5888 validation.go:28] Cannot validate kubelet config - no validator is available
k8s.gcr.io/kube-apiserver:v1.17.17
k8s.gcr.io/kube-controller-manager:v1.17.17
k8s.gcr.io/kube-scheduler:v1.17.17
k8s.gcr.io/kube-proxy:v1.17.17
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5

编写脚本,使用阿里云的 k8s 官方镜像源来下载这些镜像:
脚本的作用是从阿里云的 kubernetes 镜像源拉取镜像到本地,然后修改镜像的标签,以符合 k8s.gcr.io 的地址格式

  • 根据kubeadm config images list命令,编辑pull-k8s-images.sh。
#创建pull-k8s-images.sh 
[root@node13 yum.repos.d]# vim pull-k8s-images.sh 

for i in k8s.gcr.io/kube-apiserver:v1.17.17 k8s.gcr.io/kube-controller-manager:v1.17.17 k8s.gcr.io/kube-scheduler:v1.17.17 k8s.gcr.io/kube-proxy:v1.17.17 k8s.gcr.io/pause:3.1 k8s.gcr.io/etcd:3.4.3-0 k8s.gcr.io/coredns:1.6.5; do
  temp=${i#k8s.gcr.io/}
  docker pull registry.aliyuncs.com/google_containers/${temp}
  docker tag registry.aliyuncs.com/google_containers/${temp} k8s.gcr.io/${temp}
  docker rmi registry.aliyuncs.com/google_containers/${temp};
done;

#修改会可执行文件
[root@node13 yum.repos.d]# chmod +x pull-k8s-images.sh 
#执行文件
[root@node13 yum.repos.d]# ./pull-k8s-images.sh 
..
..
Digest: sha256:7ec975f167d815311a7136c32e70735f0d00b73781365df1befd46ed35bd4fe7
Status: Downloaded newer image for registry.aliyuncs.com/google_containers/coredns:1.6.5
registry.aliyuncs.com/google_containers/coredns:1.6.5
Untagged: registry.aliyuncs.com/google_containers/coredns:1.6.5
Untagged: registry.aliyuncs.com/google_containers/coredns@sha256:7ec975f167d815311a7136c32e70735f0d00b73781365df1befd46ed35bd4fe7

#检查是否下载成功
[root@node13 yum.repos.d]# docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/kube-proxy                v1.17.17            3ef67d180564        3 months ago        117MB
k8s.gcr.io/kube-controller-manager   v1.17.17            0ddd96ecb9e5        3 months ago        161MB
k8s.gcr.io/kube-apiserver            v1.17.17            38db32e0f351        3 months ago        171MB
k8s.gcr.io/kube-scheduler            v1.17.17            d415ebbf09db        3 months ago        94.4MB
k8s.gcr.io/coredns                   1.6.5               70f311871ae1        17 months ago       41.6MB
k8s.gcr.io/etcd                      3.4.3-0             303ce5db0e90        17 months ago       288MB
k8s.gcr.io/pause                     3.1                 da86e6ba6ca1        3 years ago         742kB

4. master节点初始化 k8s 集群

以下步骤,只对于master节点

[root@node13 ~]# kubeadm init --apiserver-advertise-address=192.168.255.132 --kubernetes-version v1.17.17 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.81.0.0/16

[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.255.132:6443 --token vkidlc.wmwtmuv4doua1b86 \
    --discovery-token-ca-cert-hash sha256:8ea01d6c8881b80004102447cf0b6c5d11700d771e88eaccbaddae5048688618

安装成功

#按安装成功提示的增加config
[root@node13 ~]#   mkdir -p $HOME/.kube
[root@node13 ~]#   sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@node13 ~]#   sudo chown $(id -u):$(id -g) $HOME/.kube/config

5.slave节点加入集群

slave节点重复 2、3步骤。
加入集群节点只需执行master节点创建集群的命令

在这里插入图片描述

#加入集群
[root@node14 ~]# kubeadm join 192.168.255.132:6443 --token vkidlc.wmwtmuv4doua1b86 \
>     --discovery-token-ca-cert-hash sha256:8ea01d6c8881b80004102447cf0b6c5d11700d771e88eaccbaddae5048688618

#结果

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
o apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值