RancherでKubernetesでHelmでDockerでJenkinsを動かす方法
Rancherを使ってKubernetesクラスタを構築し、HelmでJenkinsをインストールする手順を紹介します。
Dockerをオーケストレーションツールで管理し、既存のアプリケーション(JenkinsとかWordPressとか)を実行したい、というとき、それぞれをインストールしていこうとすると、ドキュメントが散在していて困ることがあります。
今回はRancher→Kubernetes→Helm→Jenkinsまで構築する一連の手順をまとめます。
全体像はこうなります。
サーバ
サーバは3台使います。
2台がKubernetesクラスタとなり、1台はNFSサーバになります。
サーバ | 役割 | IPアドレス | RancherOS | Kubectl | Helm |
---|---|---|---|---|---|
マスター | Kubernetes Master | 10.249.20.100 | ○ | ○ | ○ |
ワーカー | Kubernetes Minion | 10.249.20.102 | x | x | x |
NFS | NFSサーバ | 10.249.20.11 | x | x | x |
OSはCentOS7.4を使います。
Rancher, Kubernetes, Helm, Docker, Jenkins
Rancher, Kubernetes, Helm, Docker, Jenkinsについては以下をご参考ください。
-
Rancher:
https://rancher.com/
http://rancher.com/docs/rancher/v1.5/en/ -
Kubernetes:
https://kubernetes.io/
https://qiita.com/mihirat/items/ebb0833d50c882398b0f
https://qiita.com/MahoTakara/items/85096f8b2632c802ab22 -
Helm:
https://github.com/kubernetes/helm
https://github.com/kubernetes/charts
https://qiita.com/tkusumi/items/12857780d8c8463f9b9c -
Docker:
https://www.docker.com/
https://qiita.com/tigberd/items/b94ae2bf7d78685cd6f5 -
Jenkins:
https://jenkins.io/
https://qiita.com/ko8@github/items/e6e058976d48d3fc3424
事前作業
事前作業として、まずはOSの設定や更新、Dockerのインストールを行います。
これは全サーバで実行します。
なお、この辺の設定はOSの初期状態次第です。
目的はOSの更新、Dockerのインストール、selinuxやiptables, firewalldの無効化、ホスト名の設定、サーバ間接続の確認です。
特にselinux、iptables, firewalldの無効化はセキュリティ設定ですので、自分の環境、方針に合わせて設定してください。
## all servers
# update Linux and install docker
sudo su -
yum -y update && yum -y upgrade
rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install epel-release
yum -y install yum-utils git wget vim
yum -y install docker
# start docker
systemctl start docker && systemctl enable docker
# stop selinux and firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
getenforce
cat /etc/selinux/config
systemctl disable iptables-services firewalld
systemctl stop iptables-services firewalld
# set hostname
ipad=$(ip addr show eth0 | sed -nEe 's/^[ \t]*inet[ \t]*([0-9.]+)\/.*$/\1/p')
hostnamectl set-hostname $(cat /etc/hostname)
echo "HOSTNAME=$(cat /etc/hostname)" >> /etc/sysconfig/network
echo "${ipad} $(hostname)" >> /etc/hosts
echo "preserve_hostname: true" >> /etc/cloud/cloud.cfg
hostname && hostname -i && hostname -f
# set ntp
yum -y install chrony
systemctl start chronyd.service
chronyc sources
yum -y install ntp
systemctl start ntpd
systemctl enable ntpd
# set network
cat << EOF > /tmp/hosts
localhost
10.249.20.11
10.249.20.100
10.249.20.102
EOF
for i in $(cat /tmp/hosts); do ssh-keyscan -H $i >> ~/.ssh/known_hosts ; done
# delete yum pkg
yum -y clean all
NFSサーバとクライアントの設定
続いてNFSサーバを構築し、NFSクライアントを設定します。
NFSサーバは10.249.20.11のサーバのみ実行します。
## nfs server
yum -y install nfs-utils rpcbind
mkdir /opt/nfs
## change network address to your env
echo "/opt/nfs 10.249.20.0/16(rw,no_root_squash)" >> /etc/exports
echo "Domain = $(hostname -d)" >> /etc/idmapd.conf
systemctl start rpcbind nfs-server
systemctl enable rpcbind nfs-server
touch /opt/nfs/test
echo "test nfs" >> /opt/nfs/test
これでNFSサーバが起動します。
/opt/nfs
をNFS共有ストレージにしています。
NFSクライアントからの接続テスト用に、/opt/nfs/test
というファイルを作り、"test nfs"と書き込んであります。
続いてNFSクライアントです。
## nfs client
yum -y install nfs-utils
mkdir /opt/nfs
## change ip address to your env
echo "10.249.20.11:/opt/nfs /opt/nfs nfs defaults 0 0" >> /etc/fstab
mount /opt/nfs
nfsstat -m
cat /opt/nfs/test
NFSサーバ 10.249.20.11の/opt/nfs
をマウントし、/opt/nfs/test
の中身を見ています。
以下のように表示されればOKです。
Rancherの起動
Rancherを起動します。
RancherはRancherOSとして、Dockerコンテナ専用のOSが提供されています。
以下のコマンドでRancherOSをDocker runし、起動することができます。
このコマンドはKubernetesマスター(10.249.20.100)で実行します。
## rancher master
# start rancher
docker run -d --restart=unless-stopped -p 8080:8080 rancher/server
Rancherが起動すると http://10.249.20.100:8080 で公開されます。
ブラウザで http://10.249.20.100:8080 を開きます。
以下のような画面が表示されていればOKです。
Kubernetesクラスタの構築
Rancherを使ってKubernetesクラスタを構築します。
KubernetesクラスタはRancherで構築、管理されます。
そのため、Rancherの画面上だけでKubernetesクラスタを構築することができます。
左上メニューのDefaults配下のManage Environmentsを選択します。
Add Environmentします。
環境としてKubernetesを選択して作成します。
これでRancher上にKubernetesの環境は作れます。
続いてKubernetesクラスタにホストを追加します。
Kubernetesクラスタにはマスター(10.249.20.100)とミニオン(10.249.20.102)を参加させます。
ホスト追加待ち状態になっているので、Add Hostsします。
まずはホストの追加先アドレスを設定します。
基本的にここはデフォルトでOKです。
まずはKubernetesマスターを追加します。
IPアドレスにKubernetesマスターのIPアドレス(10.249.20.100)を書き込みます。
コマンドが生成されるので、このコマンドをコピーしてKubernetesマスターのコンソールで実行します。
ホストが追加されると、Rancher上ではこのように見えます。
Kubernetesクラスタが起動すると、以下のようにKubernetesダッシュボードも起動します。
Kubectlのインストール
Kubernetesクラスタの設定が済んだら、kubectlをマスターにインストールします。
KubectlやhelmコマンドはRancherのCLIで操作することもできますが、どうも不安定なようなので、OSにも入れておきます。
公式なkubectlのインストール方法は以下をご参考ください。
https://kubernetes.io/docs/tasks/tools/install-kubectl/
# install kubectl
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.8.0/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv ./kubectl /usr/local/bin/kubectl
kubectlのconfigはRancherの画面上で確認することができます。
これをコピーし、~/.kube/config
に書き込みます。
cat <<- EOF > ~/.kube/config
apiVersion: v1
kind: Config
clusters:
- cluster:
api-version: v1
insecure-skip-tls-verify: true
server: "https://10.249.20.100:8080/r/projects/1a7/kubernetes:6443"
name: "KubeEnv"
contexts:
- context:
cluster: "KubeEnv"
user: "KubeEnv"
name: "KubeEnv"
current-context: "KubeEnv"
users:
- name: "KubeEnv"
user:
token: "QmFzaWMgTURWQlJURXdOemxHTlRaRVJUTkROa1pCTlRNNlYySmpUa2RaVnpaeGIxcHhhRTFoTlRoMFVYVjZkMVZTV1dwS1MwdHJOV3RVTkhVNWRuVkhZZz09"
EOF
kubectl cluster-info
最後にkubectlが使えるか、試してみます。
成功していたら以下のように表示されます。
Helmのインストール
Helm自体はRancherでKubernetesをインストールしたときに自動的に導入されています。
ここではKubernetesマスターにHelmコマンドをインストールし、Helmクライアントとして使えるようにします。
公式のHelmのインストール方法は以下をご参考ください。
https://docs.helm.sh/using_helm/#installing-helm
# install helm commands
curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh
chmod 700 get_helm.sh
./get_helm.sh
helm init
helm init --upgrade
helm version
Helmクライアントをインストールし、マスターからHelmコマンドが使えるようになりました。
上記のhelm init upgrade
でHelmサーバをアップデートしていますが、少し時間がかかることがあるので気長に待ちましょう。
Kubernetes PersistentVolumeの設定
KubernetesにPersistentVolumeを設定します。
PersistentVolumeはKubernetesで永続ストレージとなります。
Dockerコンテナで作ったファイルはDockerコンテナの外に保存しないかぎり、Dockerコンテナが削除されるとファイルも消えます。
Kubernetesの場合、複数サーバでDockerコンテナが起動するため、永続性のある共有ストレージにファイルやデータを保存します。
詳しくは以下をご参考ください。
https://kubernetes.io/docs/concepts/storage/persistent-volumes/
https://qiita.com/kaishuu0123/items/4c4336851d06ba906bab
PersistentVolumeをつくり、ためしにnginxを使ってNFSにデータが書き込めるか、試します。
以下はKubernetesマスターで実行します。
# setup persistent volume
cat <<- EOF > /opt/pv-nfs.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs
spec:
capacity:
storage: 50Gi
accessModes:
- ReadWriteMany
nfs:
server: 10.249.20.11
path: "/opt/nfs"
EOF
kubectl create -f /opt/pv-nfs.yml
cat <<- EOF > /opt/pvc-nfs.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
EOF
kubectl create -f /opt/pvc-nfs.yml
kubectl get pv,pvc
まずはPersistentVolumeとPersistentVolumeClaimを作り、NFSを設定しました。
# try run nginx with persistent volume
cat <<- EOF > /opt/rc-nfs.yml
apiVersion: v1
kind: ReplicationController
metadata:
name: rc-nfs-test
spec:
replicas: 1
selector:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- name: nginx
containerPort: 80
volumeMounts:
- name: nfs
mountPath: "/usr/share/nginx/html"
volumes:
- name: nfs
persistentVolumeClaim:
claimName: nfs
EOF
kubectl create -f /opt/rc-nfs.yml
kubectl get pods
echo "NFS Works" > /opt/nfs/index.html
Kubernetesクラスタにnginxをデプロイします。
VolumeMountsにNFSを設定し、/opt/nfs/index.html
に"NFS Works"と書き込みました。
kubectl exec rc-nfs-test-sqkzn cat /usr/share/nginx/html/index.html
cat /opt/nfs/index.html
/opt/nfs/index.html
に書き込めていることを確認します。
OKであれば、不要なnginxは削除します。
kubectl delete pods,rc --all
HelmでJenkins起動
最後に、Helmを使ってJenkinsを起動します。
HelmでJenkinsをインストールするだけであれば、helm install stable/jenkins
で済むのですが、これだとPersistentVolume不在で正常起動できないことがあります。
HelmでPersistentVolumeを設定するため、以下のオプション付きで起動します。
なお、HelmのJenkins起動方法や使えるオプションは以下をご参考ください。
https://github.com/kubernetes/charts/tree/master/stable/jenkins
# helm install jenkins
helm install --name my-jenkins --set persistence.enabled=true,persistence.size=10Gi,Persistence.ExistingClaim=nfs stable/jenkins
これでJenkinsが起動すると、以下のNotesが表示されます。
Notesに従って、Jenkins adminユーザのパスコードを取得し、URLを入手します。
このURLをブラウザで開きます。
起動に時間がかかることもありますが、成功するログイン画面が表示されます。
adminユーザでさきほどのパスコードを入力し、ログインします。
成功です!
なお、Jenkinsの起動はKubernetesダッシュボードから確認することもできます。