Skip to content

Instantly share code, notes, and snippets.

@preinpost
Last active January 14, 2025 00:25
Show Gist options
  • Save preinpost/b7e8e52afef2797e8aa878cf8487d828 to your computer and use it in GitHub Desktop.
Save preinpost/b7e8e52afef2797e8aa878cf8487d828 to your computer and use it in GitHub Desktop.
kubeadm install
package main
import (
"fmt"
"os/exec"
"os"
)
func writeAndRunScript(filename, content string) error {
// 스크립트를 파일로 작성합니다.
err := os.WriteFile(filename, []byte(content), 0755)
if err != nil {
return fmt.Errorf("파일 작성 오류: %v", err)
}
// 작성된 스크립트를 실행합니다.
cmd := exec.Command("bash", filename)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}
func main() {
if len(os.Args) < 3 {
fmt.Println("사용법: go run main.go <인터페이스 ID> <master/worker>")
return
}
interfaceID := os.Args[1]
var isMaster bool
if os.Args[2] == "master" {
isMaster = true
} else {
isMaster = false
}
// 각 스크립트를 문자열로 정의합니다.
vmEnvEditScript := `#!/bin/bash
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
ufw disable
`
resolvedEditScript := `#!/bin/bash
sudo sed -i'.orig' -e 's/^#DNS=$/DNS=1.1.1.1/' /etc/systemd/resolved.conf
sudo systemctl restart systemd-resolved
`
dockerInstallScript := `#!/bin/bash
sudo apt-get update &&
sudo apt-get install -y ca-certificates curl &&
sudo install -m 0755 -d /etc/apt/keyrings &&
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc &&
sudo chmod a+r /etc/apt/keyrings/docker.asc &&
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" |
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null &&
sudo apt-get update &&
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin &&
sudo docker run --rm hello-world
`
containerdEditScript := `#!/bin/bash
cat <<EOL | sudo tee /etc/containerd/config.toml
version = 2
[plugins]
[plugins."io.containerd.grpc.v1.cri"]
[plugins."io.containerd.grpc.v1.cri".containerd]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
EOL
sudo systemctl restart containerd
`
iptablesSetupScript := `#!/bin/bash
modprobe br_netfilter
echo "br_netfilter" | sudo tee /etc/modules-load.d/k8s.conf
cat <<EOL | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOL
sudo sed -i'.orig' -e '/^#net\.ipv4\.ip_forward=1/s/^#//' /etc/sysctl.conf
sudo sysctl --system
`
kubeadmInstallScript := `#!/bin/bash
sudo apt-get update &&
sudo apt-get install -y apt-transport-https ca-certificates curl gpg &&
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg &&
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list &&
sudo apt-get update &&
sudo apt-get install -y kubelet kubeadm kubectl &&
sudo apt-mark hold kubelet kubeadm kubectl &&
sudo systemctl enable --now kubelet
`
kubeadmInitScript := fmt.Sprintf(`#!/bin/bash
INTERFACE_ID=%s
IP_ADDRESS=$(ip addr show "$INTERFACE_ID" | grep 'inet ' | awk '{print $2}' | cut -d/ -f1)
if [ -z "$IP_ADDRESS" ]; then
echo "인터페이스 $INTERFACE_ID에 IP 주소가 없습니다."
exit 1
fi
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address="$IP_ADDRESS" --pod-network-cidr=10.244.0.0/16
`, interfaceID)
// 각 스크립트를 파일로 작성하고 실행합니다.
if err := writeAndRunScript("vm-env-edit.sh", vmEnvEditScript); err != nil {
fmt.Printf("Error executing vm-env-edit.sh: %v\n", err)
return
}
if err := writeAndRunScript("resolved-edit.sh", resolvedEditScript); err != nil {
fmt.Printf("Error executing resolved-edit.sh: %v\n", err)
return
}
if err := writeAndRunScript("docker-install.sh", dockerInstallScript); err != nil {
fmt.Printf("Error executing docker-install.sh: %v\n", err)
return
}
if err := writeAndRunScript("containerd-edit.sh", containerdEditScript); err != nil {
fmt.Printf("Error executing containerd-edit.sh: %v\n", err)
return
}
if err := writeAndRunScript("iptables-setup.sh", iptablesSetupScript); err != nil {
fmt.Printf("Error executing iptables-setup.sh: %v\n", err)
return
}
if err := writeAndRunScript("kubeadm-install.sh", kubeadmInstallScript); err != nil {
fmt.Printf("Error executing kubeadm-install.sh: %v\n", err)
return
}
if isMaster {
if err := writeAndRunScript("kubeadm-init.sh", kubeadmInitScript); err != nil {
fmt.Printf("Error executing kubeadm-init.sh: %v\n", err)
return
}
}
// 모든 스크립트가 성공적으로 실행된 후 *.sh 파일 삭제
cmd := exec.Command("bash", "-c", "rm -rf *.sh")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
fmt.Printf("Error deleting script files: %v\n", err)
return
}
fmt.Println("모든 스크립트가 성공적으로 실행되었습니다.")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment